学习目标:
- sql注入原理及如何避免sql注入
- XSS跨站点脚本攻击原理以及如何避免
学习内容:
sql注入的原理(攻击者利用客户端用户输入字符串后面加入sql语句,如果程序在设计时忽略了检查,那么注入的sql语句就会被数据库误认为是正常的sql语句而运行,以此达到欺骗数据库来查询,进一步获取到数据信息)
- 恶意拼接查询 SELECT * FROM users WHERE user_id = $user_id。user_id 是传入的参数,如果传入的参数值为“1234; DELETE FROM users”。那么最终执行语句就会变成删除users表中的所有数据。
-
利用注释执行非法命令 SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version=$version。如果 version 包含了恶意的字符串
'-1' OR 3 AND SLEEP(500)--
,那么最终查询语句会变为一直在查询中,如果添加了修改,删除等恶意指令,那么将会造成更大的破坏。 -
传入非法参数 SQL 语句中传入的字符串参数是用单引号引起来的,如果字符串本身包含单引号而没有被处理,那么可能会篡改原本 SQL 语句的作用。
-
添加额外条件 UPDATE users SET userpass='$userpass' WHERE user_id=$user_id;如果user_id 被传入恶意的字符串“1234 OR TRUE”,那么最终的 SQL 语句会变为:UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE; 这将更改所有用户的密码。
如何避免sql注入
-
过滤输入内容,校验字符串(在数据提交到数据库之前,把用户输入中不合法的字符去除)
-
参数化查询(将数据值设置成参数)
-
安全测试、安全审计(定期进行扫描安全漏洞)
-
避免使用动态SQL(避免将用户输入的数据直接放进sql语句中)
-
不要将敏感数据保留在纯文本中(不要将敏感数据保留在纯文本中)
-
限制数据库权限和特权
-
避免直接向用户显示数据库
XSS跨站点脚本攻击的原理
- 在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入其中Web里面的javascript代码会被执行,从而达到恶意攻击用户的目的。XSS是攻击客户端,最终受害者是用户。
- xss漏洞关键就是寻找参数未过滤的输出函数
- 两种情况。一种通过外部输入然后直接在浏览器端触发,即反射型XSS;还有一种则是先把利用代码保存在数据库或文件中,当web程序读取利用代码并输出在页面上时触发漏洞,即存储型XSS。DOM型XSS是一种特殊的反射型XSS。
如何检测跨站点脚本攻击:
- 黑盒测试时:只需要将尖括号、单双引号等提交到web服务器,检查返回的html页面里面有没有保留原来的特殊字符即可判断;
- 白盒测试时:只需寻找带有参数的输出函数,然后根据输出函数对输出的内容回溯输入参数,观察有没有过滤;
如何预防跨站点脚本攻击:
- 特殊字符HTML实体转码。最好的过滤方式是在输出和二次调用的时候进行加HTML实体一类的转码,防止脚本注入。
- 标签事件属性黑名单。特殊字符容易被绕过,所以还得加标签事件得黑名单或者白名单,这里推荐使用白名单的方式,实现规则可以直接使用正则表达式来匹配,如果匹配到的事件不在白名单列表,就可以直接拦截,而不是过滤为空。