- 可控变量(注入点,就是传参)
- 带入数据库查询
- 变量未存在过滤或过滤不严谨
例子:
获取admin表的pass里面的数据
select * from users where id=1 union select 1,pass,3,4 from admin //正常执行的SQL查询命令 http://127.0.0.1:8080/test.php?x=1 union select 1,pass,3,4 from admin //有注入点的SQL注入示例
http://127.0.0.1:8080/test.php?x= //注入点,可控变量
修改URL地址上的参数值,就等于修改对应执行的SQL语句(利用自定义的SQL语句达到查询指定数据)
SQL注入的危害?
数据库数据泄露,文件操作,数据读取等
数据泄露可导致后台权限,后台权限导致网站权限,网站权限导致服务器权限。。。。。。
由于SQL注入属于WEB应用层,发现的话可以采用web扫描器或手工检测,利用的话也是分为工具及手工(相互配合使用,工具不一定万能),常用工具Sqlmap。
- 数据库类型
不同数据库类型导致不同攻击方式
access
mysql
mssql
Oracle
postSQL等
- 提交方式
参数传递的提交方式不同类型导致不同攻击方式
get
post
HTTP
全局提交
cookie等
- 参数类型
参数的数据类型导致不同攻击方式
数字
字符
搜索
- 绕过注入
waf防护
代码防护
函数防护
其他防护
- SQL查询类型
select
insert
update
delete等
- 盲注或复杂注入
各类复杂的注入问题
延时注入
二次注入
逻辑注入等
初学者建议搭建sqli-labs靶场学习
1.降低PHP版本
2.修改代码中的mysql连接函数
注意经常遇到的问题:
www.xxx.com/php?page=1&id=5 该注入点如果用以前过时的注入工具对这个地址注入时,很可能只在后面加上判断语句:
www.xxx.com/php?page=1&id=5 and 1=1
这就造成了,只测试到id参数,而前面的page参数测试不到,所以我们要把id和page参数位置调换一下:
www.xxx.com/php?id=5&page=1 and 1=1
这样才行,使用sqlmap可以自动测试两个参数