判断SQL注入点
单引号判断法
在浏览器地址框输入下面的内容:
http://xxx/test.php?id=1'
如果页面返回错误,则存在sql注入,无论字符型还是整形都会因为单引号个数不匹配而报错。
判断注入类型
通常SQL注入分为两种:数字型+字符型
数字型:
select * from table_name where id = X,通常构造 and 1=1 以及 and 1=2来判断
字符型:
select * from table_name where id = 'X',通常构造 and '1'='1 以及 and '1'='2来判断
通过返回的数据来判断,如果 and '1'='1 可以返回数据,and '1'='2 不返回数据,表示漏洞存在。
验证
在环境中选择SQL Injection (GET/Search)页面进行跳转,拼接SQL进行测试,是否存在漏洞:
image.png
通过返回,可以看到上面的查询字符串已经造成sql的异常,需要将SQL变成正常可以的,修改如下:
image.png
修改的查询语句为:t %' and '1' = '1' --+
注入防范
1.减少错误信息
不要把类似SQL的信息返回给前端,尽可能减少有用信息的返回
2.对输入特殊符号进行转义
在前端或者后端,将一些特殊符号进行过滤或者转义,例如:$id=mysql_escape_string($id)
3.对输入特殊词组进行过滤
常见的关键字:and、or、union 、select、空格等等过滤
SQL 注入的分类
1.布尔型注入
http://test.com/view?id=1 and substring(version(),1,1)=5 ,联合布尔查询,使得程序返回数据。如果服务端MySQL版本是5.X的话,那么页面返回的内容就会跟正常请求一样。
2.可联合查询注入
http://test.com/view?id=1 UNION ALL SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
最快捷的方法,通过UNION查询获取到所有想要的数据,前提是请求返回后能输出SQL执行后查询到的所有内容。构造union语句,返回表、字段等相关信息。
3.基于时间延迟注入
select * from user where id= ‘4’ and sleep(3)
如果布尔型注入、可联合查询注入都无法发挥作用的时候或者页面没有返回异常信息等,可以使用基于时间延迟注入,来判断SQL是否正常执行。
4.报错型注入
如果页面有返回SQL报错信息,可以直接从报错信息中获取想要的信息,根据信息调整SQL语句,来测试返回。
5.可多语句查询注入
http://test.com/view?id=1;update t set name = ‘a‘ where id=1
可以执行多条SQL,有可能会导致数据全部丢失,慎用。
网友评论