sqli_labs這個(gè)神奇的練習(xí)sql注入的地方真的挺不錯(cuò)的聪舒,小白的靶場(chǎng)词身。在練習(xí)之前冶匹,去看看PHP和sql的查詢語句能使練習(xí)事半功倍椰弊。
話不多說,開始愉快的練習(xí)之旅(? ?_?)?
這里貼一個(gè)學(xué)習(xí)鏈接傳送門
Less-1 Error Based- 單引號(hào)字符
這里顯示的sql語句能幫助我們更好的分析問題(當(dāng)然不是自帶的)
在url中輸入?id=1可以看到
可以通過改變id發(fā)現(xiàn)不同的name和password温鸽,這就獲取不同的信息保屯?當(dāng)然沒那么簡單(;′д`)ゞ
看到第一節(jié)的標(biāo)題很明顯提示了我們這一節(jié)應(yīng)該是和單引號(hào)有關(guān)系涤垫。那么試試這個(gè)呢
于是發(fā)現(xiàn)出現(xiàn)了錯(cuò)誤
那么 limit 0姑尺,1又是什么意思?蝠猬?切蟋??
LIMIT 0,1榆芦,表示從第一個(gè)元素即其下標(biāo)為0開始返回總數(shù)為1個(gè)的元素柄粹,也就是每次查詢只會(huì)返回一個(gè)查詢數(shù)據(jù)。繼續(xù)擼起袖子匆绣,加油思考驻右。
那么既然出錯(cuò)了,那就試試是不是真的存在sql漏洞
果然執(zhí)行了旺入。看來是真的存在漏洞凯力,這樣就可以肆無忌憚的開始利用這漏洞進(jìn)行查詢了茵瘾。
大體’剝洋蔥’思路:字段--數(shù)據(jù)庫名-數(shù)據(jù)庫的表-表中的內(nèi)容
1.
猜字段用 order by 語句,再用#將后面一個(gè)‘注釋掉,構(gòu)造成我們想要的語句
沒有將#進(jìn)行編碼
繼續(xù)試試
發(fā)現(xiàn)沒有第四個(gè)字段祈惶,所以字段就是3了
2.
接著查詢雕旨,union select(聯(lián)合查詢語句) 那三個(gè)字段
使用 union select 1扮匠,2,3 沒有出現(xiàn)想要的數(shù)據(jù)庫名啊凡涩,換成database()依舊不行棒搜,這是為什么?用函數(shù)試一試
其中:
user()返回當(dāng)前數(shù)據(jù)庫連接使用的用戶
database()返回當(dāng)前數(shù)據(jù)庫連接使用的數(shù)據(jù)庫
version()返回當(dāng)前數(shù)據(jù)庫的版本
通常會(huì)使用concat-ws函數(shù)來將這些函數(shù)進(jìn)行組合使用并顯示出來活箕。
char()函數(shù)為將里面的參數(shù)轉(zhuǎn)化為相應(yīng)的字符力麸,32為空格,58為冒號(hào)(:)育韩,通過這樣的方式可以繞過一些簡單的過濾機(jī)制克蚂。
然而依舊不行,心中跑過一萬只草泥馬
于是通過搜索這個(gè)問題發(fā)現(xiàn)是因?yàn)樵谠创a中mysql_fetch_array() 函數(shù)只能取其中一行來進(jìn)行輸出筋讨。所以只能顯示這個(gè)bumb,后面的語句都沒有顯示出來埃叭。于是乎,嘿嘿嘿嘿悉罕,那就讓前面的兩個(gè)查詢字段失效就OK了赤屋,那么從id上下手讓他沒有name和password,只有第三個(gè)查詢字段蛮粮。
出現(xiàn)了益缎,數(shù)據(jù)庫名就是security
3.
繼續(xù)查詢這個(gè)數(shù)據(jù)庫的表格名
使用的group_concat函數(shù)一下把所有的表格名寫出來,也可以改變limit的值來遍歷表格然想。
于是這個(gè)數(shù)據(jù)庫一共有四個(gè)表格,我們選擇users表來繼續(xù)
4.
依舊使用group_concat函數(shù)來查詢欣范,不過這次查詢的是users表的列(column)
得到列名以后变泄,就開始可以用列名來得到數(shù)據(jù)了
5.
繼續(xù)用group_concat,然而這個(gè)結(jié)果恼琼。妨蛹。。晴竞。有點(diǎn)難以辨認(rèn)啊
換一種姿勢(shì)蛙卤,加上concat_ws
總結(jié):
1.關(guān)于注入的關(guān)鍵是找到sql語句的語法
常用查詢語句是group_concat和concat_ws
2.單引號(hào)的注入是用以閉合之前的查詢語句
Less-2 Error Based- 整型數(shù)字
首先給出?id=1看看
在測(cè)試一下能不能字符型注入
看來是不行的呢,但是看看這個(gè)錯(cuò)誤信息他是多了一個(gè)’(單引號(hào))噩死,那么可不可能這個(gè)sql語句之中不需要引號(hào)呢
來測(cè)試一下
查詢結(jié)果一樣颤难,如此看來是和字符沒有關(guān)系了。
來直接構(gòu)造注入語句吧
1.字段
2.數(shù)據(jù)庫名
3.該干嘛干嘛
剩下的和第一節(jié)步驟一樣了已维。(☆▽☆)
Less-3 Error Based- 帶引號(hào)的單引號(hào)
老樣子用?id=1'測(cè)試一哈
我們看一下報(bào)錯(cuò)的信息(打紅圈的地方)是 '1'') ,去掉注入的地方得到的是' ')行嗤,也就是說比第一節(jié)的地方多了個(gè) )
于是大膽推測(cè)他的select語句會(huì)不會(huì)是 (' ') ,俗話說還是要搞一下才知道( ?? ω ?? )?
啊哈,和id=1時(shí)的結(jié)果一樣了垛耳。決定就是你了栅屏,剩下的步驟就和第一節(jié)差不多了飘千。
Less-4 Error Based- 雙引號(hào)
用常用的 id=1' 來試試。
沒有問題栈雳,那換一下本章所用的雙引號(hào)來卡看护奈。嗯,果然出現(xiàn)問題了哥纫。來看看看后半句 "1"),繼續(xù)構(gòu)造語句逆济。
嗯,和第三節(jié)相似
bingo磺箕!
Less-5 Double Injection-單引號(hào)
看到標(biāo)題頓時(shí)一懵奖慌,什么是雙注入啊,百度一會(huì)才曉得是這樣的 當(dāng)一個(gè)聚合函數(shù)(通常用count())松靡,比如concat函數(shù)后面如果使用分組語句就會(huì)把查詢的一部分以錯(cuò)誤的形式顯示出來 也就是說雙注入是要有兩個(gè)部分來注入简僧,一個(gè)使他得到信息,一個(gè)使信息顯示出來雕欺。
根據(jù)試了試id來看果然啥都沒有
迷之 you are in.........
確定是否有漏洞
還是有的
加個(gè)單引號(hào)
看來和第一節(jié)的出錯(cuò)點(diǎn)是一樣的岛马。字段的查詢也是OK的。
那么問題來了屠列,如何讓我們的查詢信息顯現(xiàn)出來讓我們看到呢啦逆。
emmmmmmmm,就用出錯(cuò)信息來看到我們想要的數(shù)據(jù)庫名之類的。如何構(gòu)造這個(gè)報(bào)錯(cuò)函數(shù)少不了count()笛洛,(這是個(gè)學(xué)習(xí)鏈接夏志,關(guān)于為什么這樣構(gòu)造)
group by 作用是分組(這個(gè)函數(shù)很有用)
rand 的使用是為了報(bào)錯(cuò)
于是乎
不過,由于rand的隨機(jī)性還是要刷新幾次才看得到苛让,同理user沟蔑,和version的得到也是這樣的。but,用rand(0)2就一定會(huì)出現(xiàn)狱杰。
接著查詢表
這里本來想用group_concat的來查詢的但是弄不出來瘦材,技術(shù)不夠只有手動(dòng)了
繼續(xù)學(xué)習(xí)group_concat的用法,group_concat學(xué)習(xí)鏈接之一猜測(cè)是因?yàn)間roup_concat是多行查詢拼接在一起然后返回的結(jié)構(gòu)仿畸,而rand只能返回一個(gè)
差列就和之前差不多
一個(gè)一個(gè)的查詢...........感覺小鐮刀并不能戰(zhàn)勝機(jī)械化
數(shù)據(jù):
Less-6 Double Injection-雙引號(hào)
測(cè)試?id=1"食棕,出錯(cuò)了
嗯,剩下的和第五節(jié)的步驟一樣了