SQL注入(二)
普通用户权限
- 无权读取information_schema库/union、order by无法使用
- 有返回sql语句错误提示,可以进行sql注入
通过布尔类型猜测
猜测字段名
' and column is null--
不存在该字段时会报错,而存在该字段则可能不输入任何信息- 使用穷举法将所有可能的字段进行尝试,可以使用burpsuite的intruder
-
- 只能说明这些字段存在,不能说明这是所有的字段
猜测当前的表名
- 通过上一步可以查到确定存在的字段名可以通过使用
' and table.user=null --
来确定这个table表中是否有user字段来确定是否存在这个表,一般只能判断当前表
猜测数据库其他表名
- 也可以使用
' and (select count(*) from table)>0--
来判断是否存在table表,可以判断库中的其他表 -
- 和前期使用sql直接查询出来的还是有些差距,查询出结果的准确基本是靠字典的质量好坏。
猜测字段内容
- 可以使用模糊查询like
' or user like '%a%
查找范围一下子变大- 可以使用爆破替换字符’a’
猜测账号对应的密码
' or user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99
- 该数据库使用md5值加密,可以将密码字典先进行md5加密再进行爆破
使用分号
- mysql里面一行命令可以使用分号同时执行两条语句,不需要破解密码
;update users set user='lzbzzz" where user ='admin
- 实验环境因为网页代码问题不能使用分号
'; INSERT INTO users (' user_id',' first_name',' last_name',' user','password','avatar') VALUES (‘35',‘zbzz',‘l',‘lzb','5f4dcc3b5aa765d61d8327deb882cf99','OK');--+
- 插入一个用户
Medium安全级别
- 在所有的特殊符号前面添加一个转义符""
- 输入的内容两边不再有两个单引号,不需要闭合
- 可以直接输入
0 union select null,database()
,不再需要添加’
high安全级别
- 直接限制输入的数据类型过滤掉其他所有的输入数据
- 安全级别高
SQL盲注
- 一般的sql注入,页面会直接返回mysql返回的报错信息,有助于开发人员发现和修复问题。
- 当不显示内建数据库返回的报错信息,只提供一个通用的错误信息。sql注入无法依据错误信息进行判断信息—sql盲注
- 没有错误信息的提示,只能基于返回的查询结果进行真假的逻辑判断
1' and 1=1 --
查看网页是否对数据有过滤,如果能返回查询结果则可以进行sql盲注。- 与前面基本一致
- 使用二进制查询信息
1' and ORD(MID((VERSION()),2,1))&1>0--+ ORD()转换为ACSII码 MID()从第二位开始截取VERSION()后一位 &1--表示截取出来的acsii和00000001进行与运算 改变&1为&2,&4.......&128 可以根据真返回结果假没有任何结果返回,推算出想要获得信息的第一位的acsii 在使用mid()截取其他字符进行如上操作