通读全文进行代码审计

若是想快速找到漏洞,那么就根据危险函数回溯到变量,去进行审计。

若是想找到精彩的漏洞,那就要通读全文,理解逻辑。

通读全文的技巧:

1.找函数集文件,往往函数集文件里面都包含通用函数。因此,可以在index.php文件或者一些功能性文件头部找到。

2.找配置文件,通常有config关键字,通过这个文件能了解程序的小部分功能,并且,如果配置文件中的参数以双引号括起来,那么就可能存在代码执行漏洞。只要我们在修改配置的时候,利用PHP可变变量的特性即可执行代码,比如下面这幅图就是双引号。(这里理解的不是很深刻,没有案例)

补充:可变变量就如下面这幅图

其中,$$a=‘world'’就等同于$hello='world',可变变量指的实际就是$$a中的变量名部分(虽然这里变量名部分是$a)可以由另一个变量$a的值来命名。

因此最后输出结果是hello world

再比如,像<?php "${@phpinfo()}"; ?> 这样的代码也是可以执行的。原理就在于双引号是解析执行,单引号是绝对的字符串。另外需要注意的是,有的写法在一些版本中不兼容,所以,下面几种写法是在所有版本中都能运行的写法:

"${ phpinfo()}"; 第一个字符为空格)
"${ phpinfo()}"; 第一个字符为tab
"${/**/phpinfo()}"; 第一个字符为注释
"${【回车】phpinfo()}"; 第一个字符为回车
"${@phpinfo()}"; 第一个字符为@

原理就是可变变量内的花括号有这么一个规则,需要判断花括号内的内容是否为真正的代码,条件即是文本的第一个字符串是否为PHP语法解析引擎的分割字符和特殊的语法符号!

综上所述需要满足两个条件,一个是双引号,另外一个是让花括号内的内容被当做是代码

再看一个比较绕的代码:

<?php $a = "${${phpinfo()}}"; ?>

这个比较绕就在于他是二次嵌套,实际上,只要将可变变量以及上面几个例子理解透彻,就会发现,不管怎么嵌套,只要最内层的phpinfo()执行了,那么网页就会显示相应信息。附上一个也可以执行的三层嵌套:

<?php "${${${phpinfo()}}}"; ?>

3.找安全过滤文件,安全过滤文件很重要,决定我们找到的可疑点能否利用。大多数应用程序都会在程序入口处对参数用函数进行过滤。

4.index文件,通过读index文件,可以了解整个程序运行流程,架构,包含的核心文件,不同目录的不同index文件有不同的实现方式。所以,最好将几个核心目录的index文件都读一遍。

以上内容没有涉及框架,如果有框架,那么难度还会更高。


补充几个PHP常用过滤函数:

addslashes(string $str)

返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。

strip_tags( string,[allowed_tags])

从字符串中去除html或者php中的标记。第二个参数可选,是允许的标记有哪些。


str_replace(find,replace,string,[count])

find是找到要替换的内容,replace是替换成这里的值,string是查找目标的范围。前三个变量都是必须的,count可选,是对替换数进行计数的变量。



preg_replace($find,$replace,$subject,$limit,$count) 

preg_replace()函数执行一个正则表达式的搜索和替换。

前三个参数和str_replace()一样的用法

$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。

$count: 可选,为替换执行的次数。

array_merge($arr1,$arr2,$arr3,……,$arrn)

将n个数组合并成一个数组

strlen($str)返回字符串长度

getenv() 获取环境变量

比如getenv('HTTP_CLIENT_IP')

strcasecmp($str1,$str2)

不区分大小写比较两个字符串字符大小,$str1<$str2,return -1;$str1>$str2,return 1;$str1=$str2,return 0;

preg_match($pattern,$subject,[$matches])

$pattern是正则匹配,$subject是要匹配的一个范围对象,如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。(这个$matches不是太懂)

header(string,replace,http_response_code)

header() 函数向客户端发送原始的 HTTP 报头。

认识到这一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题):

上面这个实际上就是302重定向

下面这个是提示用户保存一个生成的 PDF 文件(Content-Disposition 报头用于提供一个推荐的文件名,并强制浏览器显示保存对话框):

require_once($file)

require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

unset($var1,$var2,……,$varn)

销毁变量,用法有点诡异,看例子


可以看到函数内echo $foo会得到错误提示该变量没有定义,因为unset将$foo在函数内的局部变量销毁了。

而外部调用环境的$foo仍保留着没有被unset进行销毁,上面官方描述上写了调用环境的$foo将保留的是在使用unset()前的变量值,因此echo出bars,而不是bar。


了解整体结构之后,进行功能点审计

按上面的文件查看步骤,函数集文件->配置文件->过滤文件->index文件,下面就应该测试最容易出现漏洞的地方了,也就是各个功能点。

这个时候,最好下载相关文件,部署到环境中,然后点点点,先简单黑盒测试,若没发现什么弊端,再去看代码,并且这个时候看代码就可以省略一些黑盒中测试过的点了。

上传文件功能

只要是能上传的地方,就都可能存在漏洞。常见的就两种,一个是格式没有限制,或者过滤不完善,导致各种任意文件上传。第二个就是文件名没有进行sql注入检测,很多程序员会忘记这一点,导致sql注入。因为文件名也是要存到数据库中的。

文件管理功能

如果程序员在开发中,直接将文件名或者文件路径在参数中传递,那么就可能导致攻击者利用../或者..\来进行跳转目录达到任意文件操作,比如任意文件读取。

另外,直接用文件名或者文件路径在参数中传递,还可能导致xss,因为,程序可能需要在页面中输出文件名字,这个时候,若文件名字也没有过滤,那么就会存在xss攻击。

登录认证功能

登录认证功能不是指一个登录过程,而是整个操作过程中的认证。而现在认证又是基于cookie和session,程序又经常会把用户账号等认证信息放到cookie中,来保持用户可以长时间登录,不会因为session超时或者关闭浏览器就退出用户。但是,如果这段cookie没有进行加密,就会导致任意用户登录的漏洞!只需要知道用户的部分信息即可登录!

找回密码功能

找回密码的时候,有的网站做的不好,改密码不用填写旧密码,直接改,然后给用户发送验证码,但是由于验证码是纯数字,而且,如果验证码时间过长,那么就会被爆破出来。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345