原文地址:https://drops.wooyun.org/tips/12751

0x00 简介


之前看了seay写的PHP代码审计的书,全部浏览了一遍,作为一个代码审计小白,希望向一些和我一样的小白的人提供一下我的收获,以及一个整体的框架和常见漏洞函数。这也算是这本书的一个学习笔记吧,可以结合我捋顺的思路来看这本书。: )

0x01 整体


学习代码审计的目标是能够独立完成对一个CMS的代码安全监测。其通用的思路有:

0x02 各种洞洞


a.文件操作漏洞

1.文件包含漏洞:

(1) 本地文件包含:

p1

p2

(2) 远程文件包含:

(3) 文件包含截断:

2.文件读取(下载)漏洞:

搜索关键函数:

file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()

3.文件上传漏洞:

搜索关键函数:

move_uploaded_file() 接着看调用这个函数的代码是否存在为限制上传格式或者可以绕过。

(1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件即可利用。

(2) 黑名单扩展名过滤:

p3

不被允许的文件格式.php,但是我们可以上传文件名为1.php(注意后面有一个空格)

(3) 文件头 content-type验证绕过:

(4) 防范:

4.文件删除漏洞:

搜索关键函数:

Metinfo的任意文件删除漏洞:

p4

$action = delete即可删除.sql的文件,如果文件不是sql直接删除提交的文件名

target.com/recovery.php?&action=delete&filename=../../index.php

b.代码执行漏洞

1.代码执行函数:

搜索关键函数:eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()

(1) preg_replace()函数:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

当$pattern处存在e修饰符时,$replacement 会被当做php代码执行。

(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…)

第一个参数为回调函数,第二个参数是回调函数的参数

p5

p6

(3)eval()assert()

当assert()的参数为字符串时 可执行PHP代码

【区分】:

eval(" phpinfo(); ");【√】 eval(" phpinfo() ");【X】
assert(" phpinfo(); ");【√】 assert(" phpinfo() ");【√】

2.动态函数执行:

动态函数后门:

#!php
<?php
$_GET['a']($_GET['b']);
?>

p7

3.命令执行函数:

搜索关键函数:system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()

(1) popenproc_open()

#!php
<?php 
popen( 'whoami >> /Users/bingdaojueai/Desktop/1.txt', 'r' ); 
?>

所在路径就会出现一个1.txt 里面的内容为命令执行后的结果

(2) 反引号命令执行:

双引号时,可以直接解析变量,造成代码执行漏洞,过狗绕过。

c.变量覆盖漏洞

1.函数使用不当:

2.$$变量覆盖:

p8

p9

d.逻辑漏洞

需要思考的问题:

1.等于与存在判断绕过:

(1) in_array(): 比较之前会自动转换类型

p10

p11

(2)is_numeric():当传入参数为hex时 直接通过并返回true 并且MYSQL可以直接使用hex编码代替字符串明文 可以二次注入 并且可能造成XSS漏洞

(3)双等于==和三等于===

2.账户体系中的越权问题:

(1) 未exit/return/die

#!php
<?php
if(file_exists('install.lock)){
    header("Location:xxx.com");
    //exit();
}
echo "test";
?>

test 依旧会被输出,替换成安装流程,PHP依旧会进行。

(2) 支付漏洞:

可能导致漏洞函数: str_replace()

p12

#!php
<?php
$a = addslashes($_GET['a']);
$b = addslashes($_GET['b']);
echo "$a<br>$b<br>";
$c = str_replace($a,'',$b);
echo trim($c);
?>

p13

e.会话认证漏洞

f.二次漏洞

1.类型:

p14

p15

2.技巧:

(1) 钻GPC等转义的空子:

(2)字符串问题:

0x03 End


自己走上安全这条路既是兴趣也是偶然,选择白盒完全是因为喜欢php,毕竟是初识代码审计,seay的书确实帮了我不少,抱作者大腿(我是萌妹纸),希望这篇文章能够帮助像我一样小白的人,花了两天总结的,如果有什么缺陷也等着大家指出。

不会开发的谈审计都是耍流氓!:)