代码审计学习(二)
SQL注入
- 由于开发者在编写数据库代码时,直接将外部可控的参数拼接到SQL语句中,没有经过任何过滤就直接放入数据库引擎执行
普通注入
- 在参数处利用select、union等构造sql注入语句。主要分为int型和string型注入
string型注入中需要用单或双引号闭合
- 关键函数
select、mysql_connect、mysql_query、mysql_fetch_now update 、insert、 delete等
编码注入
1. 宽字节注入
- 漏洞产生原因:
```
- set character_set_client = ‘gbk’
- SET NAMES ‘gbk’
```
- 漏洞利用:当注入参数里带入%df%27,即可把过滤的(\)%5c吃掉
%df%5c -> 運
- 合理使用mysql_real_escape_string可解决这个漏洞
- 关键函数:
SET NAMES character_set_clint=gbk mysql_set_charset('gbk')
2. 二次urldecode注入
漏洞原因:当提交参数到web服务器时,会先自动解码一次。若程序里使用了urldecode或者rawurldecode函数来解码参数,则会出现二次注入漏洞
漏洞利用:参数里带入%2527
%2527 二次解码后-> ‘
- 关键函数:
urldecode
rawurldecode
防范
1. magic_quotes_gpc/runtime魔术引导
2. 过滤函数和类
addslashes()
mysql_escape_string() / mysql_real_escape_string()
intval()
3. PDO prepare 预编译
XSS漏洞
- 通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序
反射型XSS
- 定义:直接通过外部输入然后在浏览器输出端触发
在白盒审计中,只需要寻找带有参数的输出函数
然后根据输出函数内容回溯输入参数,观察是否有过滤
储存型XSS
- 定义:需要先把利用代码保存在比如数据库或者文件中,当WEB程序读取利用代码并输出在页面上时执行利用代码
同样要寻找为过滤的输入与输出点
漏洞防范
1. 特殊字符HTML实体转码
- 一般的XSS漏洞都是因为没过滤特殊字符,导致可以通过注入单引号以及尖括号等字符利用漏洞
- 常见特殊字符:
```
- 单引号(‘)
- 双引号(“)
- 尖括号(< >)
- 反斜杠()
- 冒号(:)
- and(&)
- #
建议在输出和二次调用时进行如HTML实体一类的转码
2. 标签事件属性黑名单
用黑名单过滤
用正则匹配白名单
CSRF漏洞
- 定义:跨站请求伪造。劫持其他用户去进行一些危险请求
白盒审计中,看核心文件中有没有验证token和referer相关的代码
漏洞防范:
1. token/referer验证
2. 验证码验证