php_bugs wp(更新中...)

前言

在github上发现了薄雾大佬贡献的php项目,记录一下思路。

第一部分

01 extract 变量覆盖

extract(array,extract_rules,prefix)

extract函数,接受一个数组,将数组键值转换成变量及值。若函数第二个参数为默认(EXTR_OVERWRITE),发生冲突时会覆盖掉原来的变量的值。

根据逻辑,若$shiyan== $content 输出flag

file_get_contents函数将文件内容存在$content中。

http://localhost/php_bugs/01_extract.php?flag=&shiyan=

flag content 变量都为NULL   == 为True 输出flag

02 绕过

分析代码逻辑,需要满足几个条件:

1
2
3
4
5
6
7
8
9
10
2.number转成整数再转回后与原值相等
3.number为回文数
4.number不能为回文数
is_numeric函数可以用%00绕过(在前在后都行),对十六进制判断为True 可以将poc 转成十六进制绕过。
intval函数遇到数字或者正负号开始转化,遇到非数字或字符串时停止,所以可以使用%0c 同时满足不是回文数这个条件。

?number=%00%0c121

03多重加密

<?php
$user = "ichunqiu";
$token = base64_encode(gzcompress(serialize($user)));
echo($token);
?>
eJwrtrKwUspMzijNK8wsVbIGACdRBQU=

04 SQL注入_WITH ROLLUP绕过

分析代码,若想获得flag,必须不使用被过滤的关键字,从数据库中查询得到的结果为一行,

且满足$key['pwd'] == $_POST['pwd']

确定用户个数:

uname = 1 or 1 limit 1 offset 0

查看第一行数据,返回 “亦可赛艇” 说明有一个用户

uname = 1 or 1 limit 1 offset 1

查看第二行数据,返回 “亦可赛艇”

uname = 1 or 1 limit 1 offset 1

查看第三行 返回 “一颗赛艇” 说明数据库中就两个用户

要输入的密码与数据库中密码相同,常见关键词都被过滤了,此处使用group by pwd with rollup rollup 是在group by 基础上的进一步聚合。

1 group by pwd with rollup limit 1 offset 2 # 
offset 从 0开始,offset 2 说明取第三行 因为只有两个用户,所以取到的值为NULL,满足条件,输出flag。

05 %00截断

ereg函数遇到%00默认字符串结束,%00占一个字符,使用科学计数法1e7

?password=1e7%00*-*

06 strcmp比较

传入非字符串,如数组 a[]=11

07 sha1()函数绕过

sha1函数默认传入为字符串类型,当传入数组类型时,会报错返回False,md5函数同样存在这个缺陷。

?name[]=a&password[]=b

08 Session验证绕过

删除cookie、password为空

09 密码md5绕过

构造一个已知明文的md5

poc:

user=' union select '202cb962ac59075b964b07152d234b70'#&pass=123

10 URLdecode 二次编码绕过

首先判断是否是字符串“hackDJ”,False再往下走。

因为浏览器会自动进行一次url解码 所以进行两次编码 满足条件

?id=h%2561ckerDJ

第二、三部分(后续更新….)

本文标题:php_bugs wp(更新中...)

文章作者:tkcharlotte

发布时间:2019年01月31日 - 19:01

最后更新:2019年02月02日 - 18:02

原始链接:boombao.net/2019/01/31/php-1/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------