php 代码审计怎么学? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maskerTUI
V2EX    PHP

php 代码审计怎么学?

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

    求大牛传授点人森经验。

    22 条回复  
    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 中
    slowgen
        10
    slowgen  
       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     Solana     1320 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 17:05 PVG 01:05 LAX 09:05 JFK 12:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86