来自先知社区-红日安全-代码审计小组的PHP代码审计的项目本阶段的内容题目均来自 PHP SECURITY CALENDAR 2017
Day1 in_array函数缺陷
定义
in_array函数
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
参数 | 描述 |
---|---|
needle | 必需,规定要在数组搜索的值 |
haystack | 必需。规定要搜索的数组 |
strict | 可选。如果该参数设置为 TRUE,则 in_array() 函数检查搜索的数据与数组的值的类型是否相同 |
实例
题目叫做愿望清单,代码如下:
漏洞解析
存在任意文件上传漏洞,
- 12行使用**in_array()**函数检测文件名。
但由于第三个参数为默认,不会检查搜索的数据与数组的值类型是否相同.若文件名为7shell.php则会解析为7,7在**range(1,24)**中,所以可绕过.造成任意文件上传漏洞。
Day2 filter_var
定义
filter_var()
filter_var(variable, filter, options)
函数通过指定的过滤器过滤一个变量。
如果成功,则返回被过滤的数据。如果失败,则返回 FALSE。
参数 | 描述 |
---|---|
variable | 必需。规定要过滤的变量。 |
filter | 可选。规定要使用的过滤器的 ID。默认是 FILTER_SANITIZE_STRING。参见 完整的 PHP Filter 参考手册,查看可能的过滤器。过滤器 ID 可以是 ID 名称(比如 FILTER_VALIDATE_EMAIL)或 ID 号(比如 274)。 |
option | 可选。规定一个包含标志/选项的关联数组或者一个单一的标志/选项。检查每个过滤器可能的标志和选项。 |
FILTER_VALIDATE_URL
FILTER_VALIDATE_URL 过滤器把值作为 URL 来验证。
escape
PHP的一个模板引擎 Twig 中的escape过滤方法,是用PHP内置函数 htmlspecialchars 来实现的
htmlspecialchars
htmlspecialchars — 将特殊字符转换为 HTML 实体
实例
题目叫做Twig,代码如下:
漏洞解析
这一关题目实际上用的是PHP的一个模板引擎 Twig ,本题考察XSS(跨站脚本攻击)漏洞。虽然题目代码分别用了 escape 和 filter_var 两个过滤方法,但是还是可以被攻击者绕过。
- 第8行程序使用 Twig 模板引擎定义的 escape 过滤器来过滤link
- 第17行 ,这里用了 filter_var 函数来过滤 nextSlide 变量,且用了 FILTER_VALIDATE_URL 过滤器来判断是否是一个合法的url
这两处过滤,用JavaScript伪协议绕过
pyload:
?url=javascript://comment%250aalert(1)
- 实际上,这里的 // 在JavaScript中表示单行注释,所以后面的内容均为注释,那为什么会执行 alert 函数呢?那是因为我们这里用了字符 %0a ,该字符为换行符,所以 alert 语句与注释符 // 就不在同一行,就能执行
- 这里我们要对 % 百分号编码成 %25 ,因为程序将浏览器发来的payload:javascript://comment%250aalert(1) 先解码成: javascript://comment%0aalert(1)
- 存储在变量 $url 中(上图第二行代码),然后用户点击a标签链接就会触发 alert 函数。
Day3 实例化任意对象漏洞
定义
__autoload
__autoload — 尝试加载未定义的类(7.2起已废弃)
class_exists
class_exists — 检查类是否已定义
SimpleXMLElement
用来表示XML文档中的元素,为PHP的内置类。
XXE攻击
实例
题目叫做雪花,代码如下:
漏洞分析
存在两个安全漏洞
-
文件包含,第8行使用class_exists() 函数来判断用户传过来的控制器是否存在,默认情况下,如果程序存在 __autoload 函数,那么在使用 class_exists() 函数就会自动调用本程序中的 __autoload 函数,攻击者可以使用
-
路径穿越来包含任意文件,当然使用路径穿越符号的前提是 PHP5~5.3(包含5.3版本)版本 之间才可以。例如类名为: …/…/…/…/etc/passwd 的查找,将查看passwd文件内容
-
第9行,实例化类的类名和传入类的参数均在用户的控制之下可以使用PHP的内置类 SimpleXMLElement来进行 XXE攻击,进而读取目标文件的内容,甚至命令执行(前提是安装了PHP拓展插件expect)
关于 SimpleXMLElement 导致的XXE攻击,下面再给出一个demo案例
Day4 strpos使用不当引发漏洞
定义
strpos
查找字符串首次出现的位置
实例
题目名字叫假胡子,代码如下:
漏洞分析
- 第8行strpos的使用不当,当strpos函数判断时首字符符合时会返回0,与false取反都为true