WAF機(jī)制及繞過(guò)方法總結(jié):注入篇

任務(wù)目標(biāo)
1.收集網(wǎng)絡(luò)上各種sql注入時(shí)使用的payload并理解其適用的環(huán)境(檢測(cè)注入、利用注入);
2.記錄sqlmap的檢測(cè)和利用過(guò)程中使用的payload;
3.理解以上涉及的sql語(yǔ)句的意思,其中會(huì)涉及不同的數(shù)據(jù)庫(kù)、不同注入場(chǎng)景。將收集方式和學(xué)習(xí)過(guò)程整理形成報(bào)告;
4.擴(kuò)展學(xué)習(xí):理解sqlmap自帶tamper的原理
0x01 Payload收集
以下payloads都基于單引號(hào)字符型注入。若是整型注入則把單引號(hào)和注釋符(–+)去掉,若是雙引號(hào)注入則把單引號(hào)換成雙引號(hào)。
我們把注入場(chǎng)景分為:
聯(lián)合查詢注入
報(bào)錯(cuò)型注入
布爾盲注
時(shí)間盲注
聯(lián)合查詢注入
使用場(chǎng)景
頁(yè)面上有顯示位
什么是顯示位:在一個(gè)在一個(gè)網(wǎng)站的正常頁(yè)面,服務(wù)端執(zhí)行SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),客戶端將數(shù) 據(jù)展示在頁(yè)面中,這個(gè)展示數(shù)據(jù)的位置就叫顯示位 。
Payload
1.判斷當(dāng)前數(shù)據(jù)表中有幾列:
2.查看顯示位在第幾列(假設(shè)一共三列):
注意:這里必須是查詢一個(gè)不存在的記錄才能起作用。
3.顯示當(dāng)前數(shù)據(jù)庫(kù)(假設(shè)顯示位中包含第三位):
4.查看當(dāng)前數(shù)據(jù)庫(kù)中的所有表:
函數(shù)
group_concat()
把所有結(jié)果都在一行輸出
5.查詢所有數(shù)據(jù)庫(kù):
6.查詢某個(gè)數(shù)據(jù)庫(kù)中的表:
7.查詢某個(gè)表中的所有字段:
8.查詢某個(gè)表中的字段內(nèi)容
0x3a會(huì)被轉(zhuǎn)義位冒號(hào)
:
報(bào)錯(cuò)型注入
使用場(chǎng)景
頁(yè)面上沒(méi)有顯示位但是有sql語(yǔ)句執(zhí)行錯(cuò)誤信息輸出。
Payload
主要有三種SQL注入報(bào)錯(cuò)方式:
ExtractValue
UpdateXml
floor
ExtractValue
首先來(lái)看ExtractValue()
函數(shù),它接受兩個(gè)字符串參數(shù),第一個(gè)參數(shù)可以傳入目標(biāo)xml文檔,第二個(gè)參數(shù)是用Xpath路徑法表示的查找路徑。這里如果Xpath格式語(yǔ)法書(shū)寫(xiě)錯(cuò)誤的話,就會(huì)報(bào)錯(cuò)。這里就是利用這個(gè)特性來(lái)獲得我們想要知道的內(nèi)容。例如:
利用concat函數(shù)將想要獲得的數(shù)據(jù)庫(kù)內(nèi)容拼接到第二個(gè)參數(shù)中,報(bào)錯(cuò)時(shí)作為內(nèi)容輸出。
UpdateXml
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target::?需要操作的xml片段
xpath_expr:?需要更新的xml路徑(Xpath格式)
new_xml:?更新后的內(nèi)容
不過(guò)這些參數(shù)都不太重要,這里和上面的extractvalue函數(shù)一樣,當(dāng)Xpath路徑語(yǔ)法錯(cuò)誤時(shí),就會(huì)報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容含有錯(cuò)誤的路徑內(nèi)容:
Floor
有關(guān)floor()
函數(shù)的注入原理可以看這篇文章。
固定格式:
******
替換為查詢語(yǔ)句即可。
1.查詢數(shù)據(jù)庫(kù)
2.查詢某個(gè)數(shù)據(jù)庫(kù)中的表
3.查詢表中的字段
4.查詢表中的字段內(nèi)容
修改limit x,1 可以顯示第x個(gè)用戶的password和username。
布爾盲注
使用場(chǎng)景
頁(yè)面沒(méi)有顯示位,也沒(méi)有SQL語(yǔ)句執(zhí)行錯(cuò)誤信息,只能通過(guò)頁(yè)面返回是否正常來(lái)判斷注入點(diǎn)。
Payload
有用到二分法的思想
數(shù)據(jù)庫(kù)名相關(guān)
1.查詢數(shù)據(jù)庫(kù)個(gè)數(shù)
2.查詢某一個(gè)數(shù)據(jù)庫(kù)名的長(zhǎng)度
3.查詢某個(gè)數(shù)據(jù)庫(kù)名
數(shù)據(jù)表相關(guān)
1.查詢表的個(gè)數(shù)
2.查詢表的長(zhǎng)度
3.查看某個(gè)表名
字段相關(guān)
1.查看某個(gè)表中的字段個(gè)數(shù)
2.查看某個(gè)字段名的長(zhǎng)度
3.查看某個(gè)字段名
記錄內(nèi)容相關(guān)
1.查看表中行數(shù)
2.查看某個(gè)字段內(nèi)容的長(zhǎng)度
3.查看某個(gè)字段的內(nèi)容
時(shí)間盲注
使用場(chǎng)景
頁(yè)面上沒(méi)有顯示位,也沒(méi)有輸出SQL語(yǔ)句執(zhí)行錯(cuò)誤信息。正確的SQL語(yǔ)句和錯(cuò)誤的SQL語(yǔ)句返回頁(yè)面都一樣,但是加入sleep(5)條件之后,如果if條件成立則頁(yè)面的返回速度明顯慢了5秒。
Payload
與布爾盲注的思想類似
1.判斷數(shù)據(jù)庫(kù)的個(gè)數(shù)
2.判斷數(shù)據(jù)庫(kù)名的長(zhǎng)度
3.查詢數(shù)據(jù)庫(kù)名
0x02 SQLMap Payload
1.以sqlilab中的Less-8為例(布爾型單引號(hào)GET盲注),查看sqlmap中使用的payloads,執(zhí)行命令:
首先獲取數(shù)據(jù)庫(kù)的個(gè)數(shù):
函數(shù)解釋:
Payload解釋:
0-9的字符ASCII值對(duì)應(yīng)的是48-57,所以sqlmap首先判斷的>51也就是>3,因?yàn)閙ysql本身就有六個(gè)數(shù)據(jù)庫(kù)但world、test、sakila這三個(gè)數(shù)據(jù)庫(kù)沒(méi)什么用可以刪除,那么最少應(yīng)該有三個(gè)數(shù)據(jù)庫(kù),performance_schema
和information_schema
和mysql
。
假如數(shù)據(jù)庫(kù)的數(shù)量是>3的話,那么就相當(dāng)于1' and true
返回頁(yè)面不會(huì)出現(xiàn)問(wèn)題,如果返回頁(yè)面不是正確頁(yè)面的話我們就可以確定一共有三個(gè)數(shù)據(jù)庫(kù)(都是默認(rèn)的)或者是由10多個(gè)數(shù)據(jù)庫(kù)(20多個(gè)也是有可能的),十位是1,2總之是小于等于3的。
再獲取每個(gè)數(shù)據(jù)庫(kù)名(這里也mysql
為例):
其實(shí)道理和上述的一樣進(jìn)行猜解,通過(guò)判斷每一位的ASCII碼值來(lái)確定每個(gè)字母。
ORD(string) :返回字符串首字符的ASCII碼值。
MID(string,start,length) :返回字符串的從start開(kāi)始長(zhǎng)度為length的字符串。IFNULL(string1,string2) :如果string1是NULL則返回string2,如果不是NULL返回string1。
CAST(volume as type) 用于數(shù)據(jù)類型轉(zhuǎn)換,將volume轉(zhuǎn)換成type類型的數(shù)據(jù)(如這里是將數(shù)字轉(zhuǎn)換為字符串)。
COUNT():統(tǒng)計(jì)個(gè)數(shù)。
DISTINCT():標(biāo)記只要不同(唯一)的值。
再以sqlilab中的Less-4為例(基于錯(cuò)誤的GET雙引號(hào)字符型注入),查看sqlmap中使用的payloads,執(zhí)行命令:
SQLMap執(zhí)行的payload如下所示:
0x03 SQLMap Tamper
SQLMap的tamper使用命令如下:
常用的tamper腳本
1.apostrophemask.py
適用數(shù)據(jù)庫(kù):ALL
作用:將引號(hào)替換為utf-8,用于過(guò)濾單引號(hào)
使用腳本前:tamper(“1 AND ‘1’='1”)
使用腳本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
2.base64encode.py
適用數(shù)據(jù)庫(kù):ALL
作用:替換為base64編碼
使用腳本前:tamper(“1’ AND SLEEP(5)#”)
使用腳本后:MScgQU5EIFNMRUVQKDUpIw==
3.multiplespaces.py
適用數(shù)據(jù)庫(kù):ALL
作用:圍繞sql關(guān)鍵字添加多個(gè)空格
使用腳本前:tamper(‘1 UNION SELECT foobar’)
使用腳本后:1 UNION SELECT foobar
4.space2plus.py
適用數(shù)據(jù)庫(kù):ALL
作用:用加號(hào)替換空格
使用腳本前:tamper(‘SELECT id FROM users’)
使用腳本后:SELECT+id+FROM+users
5.nonrecursivereplacement.py
適用數(shù)據(jù)庫(kù):ALL
作用:作為雙重查詢語(yǔ)句,用雙重語(yǔ)句替代預(yù)定義的sql關(guān)鍵字(適用于非常弱的自定義過(guò)濾器,例如將
select替換為空)
使用腳本前:tamper(‘1 UNION SELECT 2–’)
使用腳本后:1 UNIOUNIONN SELESELECTCT 2–
6.space2randomblank.py
適用數(shù)據(jù)庫(kù):ALL
作用:將空格替換為其他有效字符
使用腳本前:tamper(‘SELECT id FROM users’)
使用腳本后:SELECT%0Did%0DFROM%0Ausers
7.unionalltounion.py
適用數(shù)據(jù)庫(kù):ALL
作用:將union allselect 替換為unionselect
使用腳本前:tamper(’-1 UNION ALL SELECT’)
使用腳本后:-1 UNION SELECT
8.securesphere.py
適用數(shù)據(jù)庫(kù):ALL
作用:追加特定的字符串
使用腳本前:tamper(‘1 AND 1=1’)
使用腳本后:1 AND 1=1 and ‘0having’=‘0having’
9.space2dash.py
適用數(shù)據(jù)庫(kù):ALL
作用:將空格替換為–,并添加一個(gè)隨機(jī)字符串和換行符
使用腳本前:tamper(‘1 AND 9227=9227’)
使用腳本后:1–nVNaVoPYeva%0AAND–ngNvzqu%0A9227=9227
10.space2mssqlblank.py
適用數(shù)據(jù)庫(kù):Microsoft SQL Server
測(cè)試通過(guò)數(shù)據(jù)庫(kù):Microsoft SQL Server 2000、Microsoft SQL Server 2005
作用:將空格隨機(jī)替換為其他空格符號(hào)(’%01’, ‘%02’, ‘%03’, ‘%04’, ‘%05’, ‘%06’, ‘%07’,
‘%08’, ‘%09’, ‘%0B’, ‘%0C’, ‘%0D’, ‘%0E’, ‘%0F’, ‘%0A’)
使用腳本前:tamper(‘SELECT id FROM users’)
使用腳本后:SELECT%0Eid%0DFROM%07users
11.percentage.py
適用數(shù)據(jù)庫(kù):ASP
測(cè)試通過(guò)數(shù)據(jù)庫(kù):Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL
9.0
作用:在每個(gè)字符前添加一個(gè)%
使用腳本前:tamper(‘SELECT FIELD FROM TABLE’)
使用腳本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
12.sp_password.py
適用數(shù)據(jù)庫(kù):MSSQL
作用:從T-SQL日志的自動(dòng)迷糊處理的有效載荷中追加sp_password
使用腳本前:tamper('1 AND 9227=9227-- ')
使用腳本后:1 AND 9227=9227-- sp_password
13.charencode.py
測(cè)試通過(guò)數(shù)據(jù)庫(kù):Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、
PostgreSQL 8.3, 8.4, 9.0
作用:對(duì)給定的payload全部字符使用url編碼(不處理已經(jīng)編碼的字符)
使用腳本前:tamper(‘SELECT FIELD FROM%20TABLE’)
使用腳本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45
14.randomcase.py
測(cè)試通過(guò)數(shù)據(jù)庫(kù):Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、
PostgreSQL 8.3, 8.4, 9.0
作用:隨機(jī)大小寫(xiě)
使用腳本前:tamper(‘INSERT’)
使用腳本后:INseRt
15.charunicodeencode.py
適用數(shù)據(jù)庫(kù):ASP、ASP.NET
測(cè)試通過(guò)數(shù)據(jù)庫(kù):Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
作用:適用字符串的unicode編碼
使用腳本前:tamper(‘SELECT FIELD%20FROM TABLE’)
使用腳本后:
%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u
0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045
16.space2comment.py
測(cè)試通過(guò)數(shù)據(jù)庫(kù):Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:將空格替換為/**/
使用腳本前:tamper(‘SELECT id FROM users’)
使用腳本后:SELECT/**/id/**/FROM/**/users
17.equaltolike.py
測(cè)試通過(guò)數(shù)據(jù)庫(kù):Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5
作用:將=替換為L(zhǎng)IKE
使用腳本前:tamper(‘SELECT * FROM users WHERE id=1’)
使用腳本后:SELECT * FROM users WHERE id LIKE 1
18.equaltolike.py
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:將>替換為GREATEST,繞過(guò)對(duì)>的過(guò)濾
使用腳本前:tamper(‘1 AND A > B’)
使用腳本后:1 AND GREATEST(A,B+1)=A
19.ifnull2ifisnull.py
適用數(shù)據(jù)庫(kù):MySQL、SQLite (possibly)、SAP MaxDB (possibly)
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 5.0 and 5.5
作用:將類似于IFNULL(A, B)替換為IF(ISNULL(A), B, A),繞過(guò)對(duì)IFNULL的過(guò)濾
使用腳本前:tamper(‘IFNULL(1, 2)’)
使用腳本后:IF(ISNULL(1),2,1)
20.modsecurityversioned.py
適用數(shù)據(jù)庫(kù):MySQL
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 5.0
作用:過(guò)濾空格,使用mysql內(nèi)聯(lián)注釋的方式進(jìn)行注入
使用腳本前:tamper(‘1 AND 2>1–’)
使用腳本后:1 /!30874AND 2>1/–
21.space2mysqlblank.py
適用數(shù)據(jù)庫(kù):MySQL
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 5.1
作用:將空格替換為其他空格符號(hào)(’%09’, ‘%0A’, ‘%0C’, ‘%0D’, ‘%0B’)
使用腳本前:tamper(‘SELECT id FROM users’)
使用腳本后:SELECT%0Bid%0DFROM%0Cusers
22.modsecurityzeroversioned.py
適用數(shù)據(jù)庫(kù):MySQL
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 5.0
作用:使用內(nèi)聯(lián)注釋方式(/!00000/)進(jìn)行注入
使用腳本前:tamper(‘1 AND 2>1–’)
使用腳本后:1 /!00000AND 2>1/–
23.space2mysqldash.py
適用數(shù)據(jù)庫(kù):MySQL、MSSQL
作用:將空格替換為 – ,并追隨一個(gè)換行符
使用腳本前:tamper(‘1 AND 9227=9227’)
使用腳本后:1–%0AAND–%0A9227=9227
24.bluecoat.py
適用數(shù)據(jù)庫(kù):Blue Coat SGOS
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 5.1,、SGOS
作用:在sql語(yǔ)句之后用有效的隨機(jī)空白字符替換空格符,隨后用LIKE替換=
使用腳本前:tamper(‘SELECT id FROM users where id = 1’)
使用腳本后:SELECT%09id FROM users where id LIKE 1
25.versionedkeywords.py
適用數(shù)據(jù)庫(kù):MySQL
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 4.0.18, 5.1.56, 5.5.11
作用:注釋繞過(guò)
使用腳本前:tamper(‘1 UNION ALL SELECT NULL, NULL,
CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS
CHAR),CHAR(32)),CHAR(58,100,114,117,58))#’)
使用腳本后:1/!UNION//!ALL//!SELECT//!NULL/,/!NULL/,
CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS//!CHAR/),CHAR(
32)),CHAR(58,100,114,117,58))#
26.halfversionedmorekeywords.py
適用數(shù)據(jù)庫(kù):MySQL < 5.1
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 4.0.18/5.0.22
作用:在每個(gè)關(guān)鍵字前添加mysql版本注釋
使用腳本前:tamper(“value’ UNION ALL SELECT
CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS
CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa”)
使用腳本后:
value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNUL
L(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58
)),/!0NULL,/!0NULL#/!0AND ‘QDWa’='QDWa
27.space2morehash.py
適用數(shù)據(jù)庫(kù):MySQL >= 5.1.13
測(cè)試通過(guò)數(shù)據(jù)庫(kù):MySQL 5.1.41
作用:將空格替換為#,并添加一個(gè)隨機(jī)字符串和換行符
使用腳本前:tamper(‘1 AND 9227=9227’)
使用腳本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
28.apostrophenullencode.py
適用數(shù)據(jù)庫(kù):ALL
作用:用非法雙字節(jié)Unicode字符替換單引號(hào)
使用腳本前:tamper(“1 AND ‘1’='1”)
使用腳本后:1 AND %00%271%00%27=%00%271
29.appendnullbyte.py
適用數(shù)據(jù)庫(kù):ALL
作用:在有效載荷的結(jié)束位置加載null字節(jié)字符編碼
使用腳本前:tamper(‘1 AND 1=1’)
使用腳本后:1 AND 1=1%00
30.chardoubleencode.py
適用數(shù)據(jù)庫(kù):ALL
作用:對(duì)給定的payload全部字符使用雙重url編碼(不處理已經(jīng)編碼的字符)
使用腳本前:tamper(‘SELECT FIELD FROM%20TABLE’)
使用腳本后:%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F
%254D%2520%2554%2541%2542%254C%2545
31.unmagicquotes.py
適用數(shù)據(jù)庫(kù):ALL
作用:用一個(gè)多字節(jié)組合%bf%27和末尾通用注釋一起替換空格
使用腳本前:tamper(“1’ AND 1=1”)
使用腳本后:1%bf%27 AND 1=1–
32.randomcomments.py
適用數(shù)據(jù)庫(kù):ALL
作用:用注釋符分割sql關(guān)鍵字
使用腳本前:tamper(‘INSERT’)
使用腳本后:I//N//SERT
作者:ca0y1h's Blog
原文:https://ca0y1h.top/