PHP代码审计Day学习笔记1-4

来自先知社区-红日安全-代码审计小组的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() 函数检查搜索的数据与数组的值的类型是否相同

实例

题目叫做愿望清单,代码如下:
PHP代码审计Day学习笔记1-4_第1张图片

漏洞解析

存在任意文件上传漏洞,

  • 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代码审计Day学习笔记1-4_第2张图片

漏洞解析

这一关题目实际上用的是PHP的一个模板引擎 Twig ,本题考察XSS(跨站脚本攻击)漏洞。虽然题目代码分别用了 escapefilter_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攻击

XXE(XML External Entity attack)漏洞

实例

题目叫做雪花,代码如下:
PHP代码审计Day学习笔记1-4_第3张图片

漏洞分析

存在两个安全漏洞

  • 文件包含,第8行使用class_exists() 函数来判断用户传过来的控制器是否存在,默认情况下,如果程序存在 __autoload 函数,那么在使用 class_exists() 函数就会自动调用本程序中的 __autoload 函数,攻击者可以使用

  • 路径穿越来包含任意文件,当然使用路径穿越符号的前提是 PHP5~5.3(包含5.3版本)版本 之间才可以。例如类名为: …/…/…/…/etc/passwd 的查找,将查看passwd文件内容

  • 第9行,实例化类的类名和传入类的参数均在用户的控制之下可以使用PHP的内置类 SimpleXMLElement来进行 XXE攻击,进而读取目标文件的内容,甚至命令执行(前提是安装了PHP拓展插件expect)

关于 SimpleXMLElement 导致的XXE攻击,下面再给出一个demo案例
PHP代码审计Day学习笔记1-4_第4张图片

详见

Day4 strpos使用不当引发漏洞

定义

strpos

查找字符串首次出现的位置

实例

题目名字叫假胡子,代码如下:
PHP代码审计Day学习笔记1-4_第5张图片

漏洞分析

  • 第8行strpos的使用不当,当strpos函数判断时首字符符合时会返回0,与false取反都为true

详见

你可能感兴趣的:(PHP审计)