SQL注入原理(基础篇)
(重点是对sql 原理的理解)进行sql 注入,攻击者能够直接对服务器实施主动攻击,而不需要用户的参与。适合小白入门,大牛们请绕开!
- 数据库内的信息全部被外界窃取
- 数据库中的内容被篡改
- 登录认证被绕过
- 其他,例如服务器上的文件被读取或者修改,服务器上的程序被执行等
0x00 UNION联合查询
我们先来看看含有sql 注入漏洞的脚本
1 | <?php |
sql 注入的语句
1 | $author->'+union+select+id,pwd,name,addr,null,null,null+from+users; |
0x01 sql 注入绕过认证
认证页面.html
1 | <html> |
认证页面.php
1 | <?php |
绕过语句
1 | username="xxxxx" |
0x02 sql 注入攻击篡改数据
篡改语句
1 | update table set title='<i>xxx</i>'where id='1' |
拼接后的语句
1 | SELECT *FROM XXX WHERE author=";update table set title='<i>xxx</i>'where id='1'--'ORDER BY id |
0x03 读取文件
产生如下URL来拷贝/ect/passwd 的内容到xxx表中:
1 | ;copy xxx(title) form '/ect/passwd'; |
copy语句是PostgreSQL数据库的扩展功能,能够将问价中的内容存入表中。此例中/ect/passwd就被存入了books表的title列。执行copy 语句需要PostgreSQL的管理员权限以连接数据库。
0x04 sql 安全解决方案
首先sql注入产生的原因:程序的开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致可以通过全局变量post/get提交一些sql语句正常执行。
从代码角度:
a:静态占位符:格式固定/定位
1
2
3
4
5
6
7
8
9
10
11
12
13
require_once 'MDB.php';
header("Content-Type:text/html;charset=UTF-8");
$author = $_GET['author'];
//连接数据库时指定字符编码为UTF-8
$mdb =MDB::connect('pgsql://xxx?charset=utf8');
//使用占位符
$sql ="SELECT * FROM xxx WHERE author=? ORDER BY id";
//准备调用sql语句
$stmt =$mdb->prepare($sql,array('text'));
//执行sql语句
$rs =$stmt->execute(array($author));从WAF角度:
可以配置设置waf策略,自定义策略!
谢谢浏览!!!