PHP|代码审计思路之PHP代码审计( 四 )


那一般看的地方有SQL注入、XSS、CSRF、SSRF、XML外部实体注入等等
6.2.1. sql注入

  1. 如果使用了框架 , 可以分辨一下框架名称以及版本 , 去搜索一下该版本的框架是否存在漏洞 , 如果存在再去cms中验证 。 因为本篇文章主要讲我自己在cms审计上的一些经验 , 因此不多深入框架的审计部分 。
  2. 如果没有使用框架 , 则需要仔细的观察数据库函数 , 一般来说 , cms是将select、insert等函数进行了封装的 , 比如$db->table(‘test’)->where(“name=admin”)便是select * from test where name=admin这种格式 , 而此时若是发现cms使用的是过滤+拼接 , 那么很有可能会出现问题 , 而如果使用了PDO , 则继续跟进涉及到table , order by等字段的拼接去 , 因为这些字段是无法使用PDO的 。
审计要素:
  • 参数是否用户可控
  • 是否使用了预编译
那么首先 , 如果没有使用框架封装的sql语句 , 那么全局搜索insert、select等sql语句关键词 , 然后定位到具体的语句 , 然后查看里面有没有拼接的变量 , 回溯可不可控 。 如果可控并且存在字符串拼接 , 很有可能就存在漏洞 。
使用了框架的就是搜索的关键词不一样 , 还是得看是否存在字符串拼接 , 可不可控 。
即使使用了预编译 , 但是如果在预编译之前字符串拼接了 , 那照样没有鸟用 , 该注入还是能注入 。
下面提供一般我会搜索的关键词(框架的根据你审计项目的框架的手册 , 自行搜索 。 )师傅们有想补充的也可以补充 。
insert
create
delete
update
order by
group by
where
from
limit
desc
asc
union
select

6.2.2. xss漏洞审计要素
  • 是否存在全局参数过滤器 , 过滤规则是否符合安全要求 , 是否存在需过滤和不需过滤两种输出 , 页面是否控制恰当 。
  • 输出时是否进行编码(HTML、JS等) 。
  • 前端是否采用了Angularjs、React、vue.js等具有XSS防护功能的前端框架进行数据输出 。
这个的话 , 我就不会关键词搜了 , 我就是会在寻找其他漏洞的过程中 , 注意有没有直接把输入原样输出的地方 , 也没有特别关注这一块 。
如果想特意挖掘这一块 , 可以
查看是否配置了全局的拦截器、过滤器 。 检查数据输出函数 , 例如常用的输出函数有print、print_r、echo、printf、sprintf、die、var_dump、var_export
6.2.3. CSRF漏洞与XSS攻击相比 , CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范 , 所以被认为比XSS更具危险性 。
审计要素
  • 是否在表单处存在随机token 。
  • 是否存在敏感操作的表单 。
CSRF主要利用场景实际上是一些越权的操作 , 或者一些敏感功能存在的地方 , 例如管理后台、会员中心等地方 。 我们可以尝试搜索表单位置 , 查看是否会生成随机token , 在查看后端代码中是否会先验证这部分的token 。 如果没有验证token , 再进一步看看是否有refer的相关验证 , 如果没有 , 那么就存在CSRF的问题 。
可以尝试全局搜索
csrf-token
csrf_token
csrftoken
csrf

下面是一个更新密码的操作 , 假设构造一个链接为 http://127.0.0.1/index.php?password_new=password&password_conf=password&Change=Change#的链接 , 直接发送给受害者点击 , 那么当前情况下 , 可以直接修改受害者的密码 , 因为没有进行任何的验证措施 。 当然一般代码不会这么写 , 只是拿DVWA的CSRF举个例子 。