sql注入原理和避免

  |   0 评论   |   0 浏览

注入原理:

利用sql的分割字段(',–等),来分割sql,同时加入一个恒成立的语句。

例如: 执行用户名 密码登录验证的sql语句 经常要输入 String sql = " select * from login where name=' " +name+ " ' and pwd = ' " +pwd+ " ' ";

这时候如果用户输入的密码是 ' or '1' = '1

这时候 整条输出语句可以拼装为 select * from login where name='xx' and pwd =' ' or '1' = '1'

因为 '1' = '1' 永远为true 相当于 select * from login; 会把表中所有数据都查出来 甚至可能进行修改、删除。

解决方案:

将用户输入的内容只是作为参数,不要将用户的输入直接用+号拼装在sql中。

php正确例子:

$sql = "select ... from app_test where uid = :uid order by id desc limit :offset,:limit";

$para = array(":uid" => $uid, ":offset" => $offset, ":limit" => $limit);

$stmt = DBPDOProxy::getInstance()->execute($sql, $para);

java正确例子:

(1) 使用interface的组件,自动支持。

(2) 如果要自己构建sql, 参数放到参数列表中,不要将参数和sql使用+号连接在一起。

String sql = "update app_test set money = money - ? where uid = ?;";

Object[] params = new Object[]{money, uid, money};

rs = getDataAccess().update(sql, params, uid);

why

sql和参数分离, 底层做了sql的预处理,在设置参数的时候做了转义了。 (java使用的PreparedStatement, php使用的PDO)

PreparedStatement setString(int

原理: 每个参数底层做了类型判断和转义。
上面是防止新写的sql的问题,还需要做离线检测手段来保证。

问题sql如何发现:

(1)扫描工具。owasp zap 扫了一下官网没有发现重大问题。 扫了一下管理后台 问题发现一些问题。

扫描工具原理:录入需要扫描的接口和页面,扫描工具回构造可以造成攻击的参数,然后一直模拟发请求。

(2)检测sql,将执行的sql异步上传到mq,后续用阿里的druid工具包检测分析。

(3)给qa介绍sql注入,接口测试增加注入的情形。

(4)数据库mysql&审计,运维开发了慢sql报警。


标题:sql注入原理和避免
作者:不断努力的青春
地址:http://songaw.com/articles/2022/01/25/1643099337081.html