你真的会PHP吗?——实验吧
刚刚做了实验吧的题目,现在整理一下
写出解题思路,希望能够帮助到那些需要帮助的人
所有的wp都是以一题一篇的形式写出
主要是为了能够让读者更好的阅读以及查找,
希望你们不要责怪!!共勉!!!
你真的会PHP吗?分值:30
- 来源: 实验吧
- 难度:中
- 参与人数:4163人
- Get Flag:714人
- 答题人数:888人
- 解题通过率:80%
你真的会PHP吗?
会?还是不会?
解题链接: http://ctf5.shiyanbar.com/web/PHP/index.php
解题思路:这一题可以get需要知识点,也可以回忆一下关于以前的知识
点击链接,进行抓包处理就会得到:
进入这个链接就会得到:http://ctf5.shiyanbar.com/web/PHP/6c525af4059b4fe7d8c33a.txt
<?php
$info = "";
$req = [];
$flag="xxxxxxxxxx";
ini_set("display_error", false);
error_reporting(0);
if(!isset($_POST['number'])){
header("hint:6c525af4059b4fe7d8c33a.txt");
die("have a fun!!");
}
foreach([$_POST] as $global_var) {
foreach($global_var as $key => $value) {
$value = trim($value);
is_string($value) && $req[$key] = addslashes($value);
}
}
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
}
if(is_numeric($_REQUEST['number'])){
$info="sorry, you cann't input a number!";
}elseif($req['number']!=strval(intval($req['number']))){
$info = "number must be equal to it's integer!! ";
}else{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){
$info="no, this is not a palindrome number!";
}else{
if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
}
}
echo $info;
接下来进行代码审计:
if(is_numeric($_REQUEST['number'])){
$info="sorry, you cann't input a number!";//条件1:输入的不能只是数字
}elseif($req['number']!=strval(intval($req['number']))){
$info = "number must be equal to it's integer!! "; //条件2:输入的值经过变整型又变成字符型后应该与原来一样
}else{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){//条件3:输入的值直接变成整型应该和其颠倒之后再变成整型一样
$info="no, this is not a palindrome number!";
}else{
if(is_palindrome_number($req["number"])){//条件4:输入的不能是回文,就是颠倒和原来不能一样
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
}
}
echo $info;
我看writeup看到有两种解法:
利用intval溢出
intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。
举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。
64 位系统上,最大带符号的 integer 值是 9223372036854775807。
通过上面我们知道服务器的操作系统是32位的,所以我们构造2147483647就可以同时满足2,3条件。
通过把空字符可以绕过is_numeric的判断(如%00,%20),所以我们构造以下poc,
number=2147483647%00 和number=2147483647%20都可。
我们来看上面的payload是怎么绕过上面的条件的,
首先因为我们post的number中包含%00或者%20这样的空字符,
所以在is_numeric判断时,会返回false,接下来 $req['number']!=strval(intval($req['number']))
intval会忽略掉我们的空字符%00与%20,所以这里也就绕过了,然后:
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
- 1
- 2
这两个值要相等,由于我们输入的number已经达到了intval的最大值,
所以当执行strrev后,得到7463847412这个值,这个值经过intval转换为2147483647,所以这两个值相等了。
但是2147483647又不是回文数,所以得到flag。
注:strval会忽略掉%00与%20
注:如果你输入number=’1’这样的字符,后台存储的字符串时’\’1\”,意思就是会把引号作为你输入的字符串的一部分。这是个很奇怪的特性,大家可以测试一下
注:其中很多细节,我是通过把源码拷贝到本地执行得到的结果,大家也可以测试一下自己的想法。
0x02科学记数法绕过
因为要求不能为回文数,但又要满足intval(req["number"])=intval(strrev(req["number"])=intval(strrev(req[“number”])),
所以我们采用科学计数法构造poc为number=0e-0%00,这样的话我们就可以绕过。
一定要时-0,才不会被判定为回文数
不得不说脑洞是真的大

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
2018-07-12 第六十七天 EsayUI
EasyUI 一、简介 1.EasuyUI介绍: EasyUI:简单的界面设计框架,作用主要是用来设计网站的后台管理系统。帮助程序员快速的构建网站界面。 2、EasyUI官网:http://www.jeasyui.com 3、EasyUI使用目录介绍: demo: easui的效果示例; locale:easyui的语言文件; plugins:easyUI的案例切割的js文件; src:源码; themes:easyUI提供的css样式; jquery.easyui.min.js:easyUI的插件; jquery.min.js:easyUI依赖额jquery文件。 EasyUI的使用: 1导入EasyUI的支持 2将要使用的EasyUI加入到项目中 导入css文件 导入js文件 3 EasyUI是通过class类选择器方式进行样式添加的 在HTML标签上使用class属性直接引入EasyUI提供的样式支持 4使用data-options指定一些样式效果,例如:小图标 使用此属性对样式的一些特效进行自定义修改 5同时可以使用style属性自定义 示例: form登录 EasyUI登...
-
下一篇
自动扫雷 python
自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。 一、准备工作 1.扫雷游戏 我是win10,没有默认的扫雷,所以去扫雷网下载 http://www.saolei.net/BBS/ 2.python 3 我的版本是 python 3.6.1 3.python的第三方库 win32api,win32gui,win32con,Pillow,numpy,opencv可通过 pipinstall--upgrade SomePackage 来进行安装注意:有的版本是下载pywin32,但是有的要把pywin32升级到最高并自动下载了pypiwin32,具体情况每个python版本可能都略有不同 我给出我的第三方库和版本仅供参考 二、关键代码组成 1.找到游戏窗口与坐标 #扫雷游戏窗口 class_name = "TMain" title_name = "Minesweeper Arbiter " hwnd = win32gui.FindWindow(class_name, title_name) #窗口坐标 left = ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果