SQL注入 02
1 SQL注入的分类
1.1 数字型注入
页面让我输入一个ID
插入一个小知识点:
-
根据HTTP标准,
?
是官方定义的查询字符串分隔符(RFC 3986) - 服务器会严格解析
?
后的内容为参数,/
后的内容为路径
?id=1
查询了id=1的username和password,这就是数字型注入
测试
闭合单引号:出现报错
http://www.test.com/test.php?id=1 and 1=1
SQL语句为:select * from table where id=1 and 1=1 ,页面正常
http://www.test.com/test.php?id=1 and 1=2
SQL语句为:select * from table where id=1 and 1=2,返回数据与原始请求不同
用and 1=1 和 1=2 可以用来测试页面是否存在注入点,如果页面两次返回的页面不一样表示此处存在注入点
1.2 字符型注入
字符型:select * from table where username=‘test’
字符型注入最关键的是如何闭合SQL语句以及注释多余的代码
查询内容为字符串时:select * from table where username = ‘test’
测试:
select * from table where username = 'test and 1=1' ,无法注入,“test and 1=1”会被数据库当作查询的字符串
select * from table where username = 'test' and '1'='1’ --’,必须闭合字符串才可以继续注入
/?id=1%27%20and%201=2--+这里页面错误回显--+表示在url栏的注释+表示空格
演示
这里演示常见的数字型注入 演示页面http://172.172.3.250/cms/show.php?id=35
一般演示步骤如下,
1,如果分别得到对应的结果说明该页面有SQL注入漏洞 '单引号,在有参数的后面输入单引号,
2,结果报错或者回显错误 and 1=1,测试回显正常
3,and 1=2,测试回显错误
总结以上内容
从上述三个测试步骤说明该页面有SQL注入漏洞 深入剖析:
1、大致能猜测到该页面的SQL语句是 select * from users(表名) where id=1
2、我们能控制输入并且能修改的参数就是id
3、这里我们只能把id=35修改成id=1 and 1=1 和id=1 and 1=2带到服务器被数据库引擎都执行成功了
4、select * from users(表名) where id=1 and 1=1 返回的结果真,所以就能回显正常内容
5、select * from users(表名) where id=1 and 1=2 返回的结果为假,and 1=2肯定为假吧,所以回显不了任何内容,内容为空