PHP-Audit-Labs-Day1学习

前言

这个项目很久就看到了,一直没认真学习。这几天被角膜炎折磨的很难受,一天学不了多久眼睛就疼了,来玩玩这个项目吧。

知识点

1: in_array 绕过

in_array
(PHP 4, PHP 5, PHP 7)

in_array — 检查数组中是否存在某个值

说明 ¶
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool
大海捞针,在大海(haystack)中搜索针( needle),如果没有设置 strict 则使用宽松的比较。

参数 ¶
needle
待搜索的值。

Note:

如果 needle 是字符串,则比较是区分大小写的。

haystack
待搜索的数组。

strict
如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。

返回值 ¶
如果找到 needle 则返回 TRUE,否则返回 FALSE。

例如文件名为 7shell.php 。因为PHP在使用 in_array() 函数判断时,会将 7shell.php 强制转换成数字7,而数字7在 range(1,24) 数组中,最终绕过 in_array() 函数判断。(这里之所以会发生强制类型转换,是因为目标数组中的元素为数字类型)

2:不能使用拼接函数的 updatexml 注入

当 updatexml 中存在特殊字符或字母时,会出现报错,报错信息为特殊字符、字母及之后的内容,也就是说如果我们想要查询的数据是数字开头,例如 7701HongRi ,那么查询结果只会显示 HongRi 。所以我们会看到很多 updatexml 注入的 payload 是长这样的 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) ,在所要查询的数据前面凭借一个特殊符号(这里的 0x7e 为符号 ‘~’ )。
一个常见的报错注入payload

updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

但是我们这里不能这样使用,因为waf把concat等常见字符串拼接函数过滤了。

这里的话我们可以使用冷门的字符串处理函数绕过

make_set函数
MAKE_SET(bits,str1,str2,...)
返回一个设定值 (一个包含被‘,’号分开的字字符串的字符串) ,由在bits 组中具有相应的比特的字符串组成。str1 对应比特 0, str2 对应比特1,以此类推。str1, str2, ...中的 NULL值不会被添加到结果中。

mysql> SELECT MAKE_SET(1,'a','b','c');

-> 'a'

mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');

-> 'hello,world'

mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');

-> 'hello'

mysql> SELECT MAKE_SET(0,'a','b','c');

-> ''

bits应将期转为二进制,如,1为,0001,倒过来排序,则为1000,将bits后面的字符串str1,str2等,放置在这个倒过来的二进制排序中,取出值为1对应的字符串,则得到hello

1|4表示进行或运算,为0001 | 0100,得0101,倒过来排序,为1010,则'hello','nice','world'得到的是hello word。'hello','nice',NULL,'world'得到的是hello。null不取,只有1才取对应字符串

类似的函数:lpad()、reverse()、repeat()、export_set()(lpad()、reverse()、repeat()这三个函数使用的前提是所查询的值中,必须至少含有一个特殊字符,否则会漏掉一些数据)。

还有一个要注意的是:updatexml报错最多只能显示32位,这种情况下我们结合SUBSTR函数来获取数据就行了。

分析源码

在下图第11~13行处,程序把用户的ID值存储在 $whitelist 数组中,然后将用户传入的 id 参数先经过stop_hack函数过滤,然后再用 in_array 来判断用户传入的 id 参数是否在 $whitelist 数组中。这里的白名单是数字1~5.
这里 in_array 函数没有使用强匹配,所以是可以绕过的,例如: id=1’ 是可以成功绕过 in_array 函数的。即经过强制类型转换后id=1

payload

127.0.0.1:88/day1/?id=1 and (select updatexml(1,make_set(3,'~',(select flag from flag)),1))

猜你喜欢

转载自www.cnblogs.com/wangtanzhi/p/12770965.html