V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maskerTUI
V2EX  ›  PHP

php 代码审计怎么学?

  •  
  •   maskerTUI · 2016-07-06 09:45:02 +08:00 · 4623 次点击
    这是一个创建于 3070 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求大牛传授点人森经验。

    22 条回复    2022-05-20 18:31:50 +08:00
    jason19659
        1
    jason19659  
       2016-07-06 09:59:24 +08:00   ❤️ 1
    Sonar 常规代码分析?
    al0ne
        2
    al0ne  
       2016-07-06 10:38:24 +08:00   ❤️ 1
    最近刚刚接触代码审计,买了本 seay 的那个代码审计的书也是没有头绪,我的方法就是查找一些 sql 关键字看看传入的时候有没有将参数进行一些处理,如参数绑定 /过滤 /转换等等 ,如果要是 xss 的话就看输出的时候有没有进行转义。其余的展示不太清楚。
    MrZephyrus
        3
    MrZephyrus  
       2016-07-06 10:59:59 +08:00   ❤️ 2
    先好好学 php 开发 自己都没写好 怎么审计呢
    yeyeye
        4
    yeyeye  
       2016-07-06 11:23:11 +08:00
    @al0ne 原来是输出的时候进行转义 我还以为是输入的时候进行转义好点 毕竟只需要一次
    menc
        5
    menc  
       2016-07-06 11:27:17 +08:00
    @al0ne 先学好开发,另外 seay 的那本书写的挺一般的,没有水平。
    SlipStupig
        6
    SlipStupig  
       2016-07-06 11:29:53 +08:00
    @menc 大专毕业的阿里 P7
    menc
        7
    menc  
       2016-07-06 11:33:29 +08:00
    @SlipStupig
    当年 seay 博客还和我互换友链,他安全水平也许可以,代码水平确实只能说不专业。
    wuhao
        8
    wuhao  
       2016-07-06 11:44:29 +08:00
    @menc easy 是 谁?
    al0ne
        9
    al0ne  
       2016-07-06 11:50:19 +08:00
    @menc 多谢指导 正在慢慢熟悉 php 中
    shuimugan
        10
    shuimugan  
       2016-07-06 11:57:45 +08:00   ❤️ 4
    不是专业的代码审计,不过也可以简单说下,下面这些方法是我刚毕业时进一个大公司后不到 1 星期挖到了多个 sql 注入与 xss 所用到的


    1.先了解要审计的应用都有什么功能
    2.再了解这个项目的一些编码规范,以及使用的框架,再简单看几个控制器或者什么鬼看看开发人员的大致编码习惯
    3.去版本控制器里看下提交记录,根据最近提交的代码的质量,规范度来判断一下这个项目的近期动态
    4.把项目搭起来,直接开扫描器扫,虽然当时扫描器扫不出什么漏洞,但起码对这个项目的安全性有一个大致的了解,而且很多扫描器对 ajax 操作是扫不了的,可以着重关注

    记下来就开始找了
    我是直接用 ide/编辑器全局搜代码的,基本上好点的框架都提供了一些获取请求参数的封装,那么直接使用$_GET,$_POST,$_COOKIE,$_REQUEST 的都要抓出来,用了框架还直接以$_GET,$_POST,$_COOKIE,$_REQUEST 获取数据的,都是比较 low 的行为,发生问题几率高很多

    当然$_SERVER 以及$_SESSION 也要着重看下,主要看从外界获取了变量之后有没有进行防御过滤

    当找完这些毫无封装的获取请求参数代码之后,就去找使用框架获取请求的代码了,项目当时用的是 CodeIgniter,那么很简单,看下文档,发现获取 get 和 post 参数的代码是
    $this->input->post()
    $this->input->get()
    而这 2 个函数第二个参数是可选的,过滤 xss 的,但是默认是 false,也就是不过滤...所以写个正则去找一下这些代码的第二个参数不填或者是 false 的,然后去追踪看后续有没有进行防御过滤,以此类推

    还有很多开发人员直接拼写 sql 语句的时候,变量名一般都会写$sql 或者包含 sql 字样的,那么就去搜非框架核心区域包含 sql 字样的 php 代码,然后去回溯这些 sql 拼接的部分是不是用参数化查询,如果不是的话是不是用户可控的,有没有进行防御过滤

    csrf 这类看下框架有没有开全局防御,然后看控制器对数据更改的功能代码是不是只接收 post 的请求或者 post 的参数,从这里入手去排查

    至于任意文件上传下载都得先找到对应功能的代码,然后去看上传文件类型有无限制,下载有无判断用户权限,下载路径是否用户可控等,很多书都有说

    我觉得与业务相关性高的比较麻烦,因为业务类型不同,很多复杂的业务前置就有一堆复杂的操作,所以比较繁琐,要黑盒白盒一起上,先无脑改参数看返回结果,再去代码里审计比较好

    还有很多常见的
    爆破类的:登录爆破,验证码爆破,重置密码爆破,改手机号爆破,各种爆破...
    边界值:负数价格,负数商品数,真是什么都有
    猥琐的:传参数给你一个数组

    比如 yii2 框架的代码:
    $id = Yii::$app->request->get('id');
    $articel = Article::findOne($id);

    看样子很正常对不对,直接传 id=1'这样也发现不了注入
    但是仔细看框架文档,findOne 函数是可以接数组的,提交 id[column1'] = 1 注入就出来了,真是巨坑

    还有一些坑,比如危险函数的,也要去找,能执行系统命令的地方,要看是不是完全不能被用户控,被用户控制的参数有没有过滤
    找一些 web shell 里常见的,比如 preg_replace 里正则放个 /e 就能执行代码,eval 就更不用说了...
    找多几个 php 一句话木马就知道了,要多猥琐有多猥琐

    比如我之前无聊时写着玩的一个
    // 利用:
    // $_GET['x'] = 'eval($_GET["code"]);';
    // $_GET['m'] = 'create_function';
    // $_GET['code'] = 'echo 123;';
    // $_GET['d'] = 'call_user_func_array'

    $_GET['d']($_GET['m'], '', $_GET['x'])();

    总的来说,对项目的架构熟悉程度越高,审计起来就越轻松
    firebroo
        11
    firebroo  
       2016-07-06 12:00:19 +08:00
    @menc seay 写的代码很可能比你多,,,
    firebroo
        12
    firebroo  
       2016-07-06 12:05:52 +08:00   ❤️ 1
    审计案列上 wooyun 搜,很多经典的。
    maskerTUI
        13
    maskerTUI  
    OP
       2016-07-06 12:10:20 +08:00 via Android
    @al0ne 我也有那本书哈
    @MrZephyrus 正在学,感觉学着挺迷茫的。
    mikezhang0515
        14
    mikezhang0515  
       2016-07-06 12:18:22 +08:00
    靠猜程序员的思路
    MrZephyrus
        15
    MrZephyrus  
       2016-07-06 12:59:14 +08:00
    @maskerTUI 慢慢来 别急于求成 别看着别人挖了好多洞就心急
    jinhan13789991
        16
    jinhan13789991  
       2016-07-06 14:23:57 +08:00
    看文件大小,每 kb500 块
    mingyun
        17
    mingyun  
       2016-09-10 19:55:57 +08:00
    tezuka
        18
    tezuka  
       2019-10-20 18:28:49 +08:00 via Android
    3 年过去了,好奇楼主现在代码审计水平怎么样了
    maskerTUI
        19
    maskerTUI  
    OP
       2019-10-29 08:58:30 +08:00
    @tezuka 哈哈,听网友的先学了 php 开发,后面再去搞代码审计,技术现在马马虎虎吧;工作内容也变了,3 年前问这问题的时候是在一个所谓的“信息安全国家队”的公司下面,从单纯的渗透人员扩展技能到代码审计,后面跳槽去了一家银行做了近两年,做的内容除了技术以外,还有一些安全体系的东西了;前两个月又跳槽来了现在这里,一个人负责公司里面所有的信息安全相关的工作了。
    总的来说,代码审计水平提升的马马虎虎吧,技能方面还有吹牛功夫倒是挺厉害的(跟乙方销售打交道学的)。
    cxy2244186975
        20
    cxy2244186975  
       2022-05-11 03:40:01 +08:00 via Android
    五年多过去了、表哥学咋样了、seay 博客 好几年前 我也经常看👍👍👍
    maskerTUI
        21
    maskerTUI  
    OP
       2022-05-14 21:00:56 +08:00
    @cxy2244186975 还在做安全岗位,不过没做攻防方向了,现在主要做安全建设和安全合规。
    cxy2244186975
        22
    cxy2244186975  
       2022-05-20 18:31:50 +08:00 via Android
    @maskerTUI 挺好的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2787 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:34 · PVG 19:34 · LAX 03:34 · JFK 06:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.