一个登录表单,也没有验证码之类的安全验证。可以直接抓包爆破
一开始想看看这里是不是存在SQL注入的,但发现使用了 mysqli 扩展进行预处理:
$link->prepare()
函数来准备 SQL 语句,得到一个 mysqli_stmt 对象。$line_pre->bind_param()
函数来绑定参数,第一个参数为参数类型,第二个参数为要绑定的参数值。$line_pre->execute()
函数执行准备好的语句,并返回执行结果。$line_pre->store_result()
函数将查询结果存储在 mysqli_stmt 对象中。$line_pre->num_rows
函数获取查询结果的行数。虽然SQL注入没有,但是这里没有任何防御爆破的措施可以直接抓包爆破
这里采用了验证码来防止暴力破解,但是验证码却是由前端生成并校验的
这种验证码,抓包即可绕过
验证码只在前端校验,删掉这个字段都可以
这里的验证码由服务器生成
当登录请求到达服务端后,服务端返回响应包,客户端再次请求验证码,达到刷新的目的。乍一看好像并没有什么问题,但是如果客户端没有收到响应包呢?这样就不会刷新验证码。
而且服务端在校验验证码非空且正确后,便校验提交的用户名和字典。正常情况下不管校验结果如何,验证码一旦提交到服务端,在验证后,不管对不对,都应该销毁,重新刷新。但这里服务端没有及时销毁更新验证码
使得抓到请求包后丢弃,便不会刷新验证码,从而达到验证码重复利用,爆破账户的目的
这里还有一个问题:服务端将验证码字符串以明文COOKIE的方式给了前端
这里使用了token验证来代替验证码,每次登录请求都会带上上一次生成的token
但是这里有一个问题,那就是生成的token,直接储存在前端,方便下一次请求携带
只要我们爆破时,把上一次的请求响应包中的token值当作这一次的token一起提交到服务端即可完成token验证,也就达到了爆破的目的。
将token和password两项设置为变量 攻击模式使用Pitchfork。选择Resource Pool将线程数设置为1(递归查找,将上一个请求的相应token作为下一个请求的payload的token,所以就不并发)
Grep-Extract模块进行相应设置,获取相应的token,截取相应token的前后标识,用于下次截取
Redirections模块设置允许重定向,选择always
payloa设置
开始爆破,成功!
这里对输入的参数没有任何过滤,就直接拼接在要显示在页面的语句中
但是前端对输入的内容有字数限制,秉持着”我的地盘我做主“的原则,手动改一下就行了
输入xss语句,提交触发
这里和1
类似,只是提交参数的方法不同,而且这里还没有字数限制
输入XSS语句,提交触发
这里模拟的是留言场景,未经过滤的留言,直接写入数据库,然后显示在页面上,造成了存储型XSS
我还尝试测试了一下SQL注入,但是很遗憾,这里会转义单引号
构造XSS语句,提交,触发弹框
这里源代码提示还有一个SQL注入彩蛋,虽然insert语句中参数有引号保护,但是删除留言的delete语句没有。但是这里有一个id
是否为数字的判断,无法注入
如果没有这个确实可以注入
这里的XSS只是涉及前端,影响浏览器本地的DOM结构。前端代码获取到输入内容直接拼接在href标签中
构造XSS语句,只要闭合掉前面的标签即可
也可以直接在href标签内插入javascript伪协议构造的语句:javascript:alert(document.cookie),点击what do you see?
(a标签))即可触发
这里与4
略有不同,这里是通过URL获取输入的内容
构造xss语句
XSS盲打是指在一些自己并不能立即触发(自己能触发,那么普通用户也可以)的一些场景,比如留言需要审核的场景或者网站管理人员收集信息的一些表单。这场景并不是普通用户或者说是攻击者可以访问的,于是就不能立即判断这类场景是否存在XSS漏洞,只能通过搭建接收平台(盲打平台),看是否收到测试目标的信息
(一般是cookie),因此叫做盲打。
这里是一份类似调查问卷的东西,需要管理员登录后台查看
提交后,登录触发
这里使用了htmlspecialchars函数对输入进行html实体编码,注意一点htmlspecialchars函数默认不对'
处理
这里试将输入拼接到a标签的href值上,考虑到html实体编码我们这里的payload不用到<
、>
就好了
可以使用javascript伪协议,点击触发
这里对输入进行了html实体编码和8
类似
使用javascript伪协议
防御:只允许http,https,其次在进行htmlspecialchars处理
这里是输入动态的生成到了js中,形成xss,javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。所以在JS的输出点应该使用\对特殊字符进行转义
这里要注意闭合前面的script标签
构造语句
这里是以GET方法提交的参数,来完成修改 个人信息
攻击者可以结合xss诱导用户点击,以用户的身份令牌叨叨修改其用户信息的目的
点击触发,成功修改
可以直接利用burpsuite生成CSRF的POC
再结合XSS漏洞,成功修改
这里采用了token验证,每次修改都必需带上上一次生成的token值
想要修改信息,就必需带上token值。而攻击者并不知道用户当前的token值是什么,因此无法完成攻击
对id参数没有任何处理,通过POST方法提交,直接拼接到select语句中,造成SQL注入
注入测试
这里通过GET方法提交,将输入的参数值字符串未经任何过滤直接拼接到SQL语句中
一般字符型注入引号测试(前提是有引号闭合)会连带将输入的数据一起报错,数字型则是光提示引号错误
这里要考虑闭合和注释掉后面的语句
这里是搜索场景的SQL注入,这里会采用模糊匹配,要注意闭合
同样也是没有任何的过滤
注入测试,使用单引号百分号闭合
所谓的XX型注入, 就是输入的值可能被各种各样的符合闭合 (比如, 单引号双引号括号等)
这类注入要注意闭合,而且闭合方法比较难猜,但可以通过报错猜出
注入测试
这里登录界面会转义输入的单引号,所以不能注入
而注册页面则是将输入的参数值直接写入数据库中,没有任何过滤
注意这里插入SQL注入语句后不能注释掉后面的语句,不然value
语句不完整,当然也可以补全value中的参数然后注释掉后面的语句
还有一个是updata注入,这个是在用户修改信息位置。这里先正常注册一个test用户
也是没有任何的过滤,注入测试
这里也一样不能注释掉后面的语句,不然sql语句结构会被破坏,然后报错
delete语句中没有对id做任何的过滤,直接插如SQL语句中
注入测试
在有的场景中,web端会对提交的请求中的header头部中的一些信息(UA、ACCEPT等)进行sql操作行为。
这里未经任何过滤就直将读取的header信息直接写入SQL数据库中,从而造成SQL注入
注入测试:' or extractvalue(1, concat(0x7e,(database()),0x7e)) or '
这里的难点是不会打印sql语句的具体错误,使得不好判断闭合方式和获取数据库数据
只能盲猜闭合方式,这种情况优先尝试布尔盲注,然后在尝试时间盲注
测试发现,这里输入kobe可以显示,输入kobe’ and 1=1#时也显示,但输入kobe’ and 1=2#时显示不存在,说明,kobe肯定为真的,只要and后面也为真,则返回kobe结果
注入测试
这里较8
比较不会将查询结果输出,网页显示也就不存在布尔类型。
这种情况只能尝试时间盲注
如果数据库名第一个字符为p
则延时5秒:kobe’ and if(substr(database(),1,1)=‘p’,sleep(5),1)#
这里设置了客户端来源编码为gbk,造成了宽字节注入。gbk编码有两位字节表示一个字符(因此被称为宽字节),而php编码utf-8则是一位。因此在存在对输入转义等情况下,而恰好数据库为gbk编码则可在引号前加上一个字符编码,使得该字符编码与转义的反斜杠经gbk编码合成一个字符。最经典的是%df
与引号前的反斜杠合成一个運
字,从而保留了引号完成SQL注入
注入测试
这里实现的是ping
操作
直接将输入拼接到shell_exec
函数中执行
这里可以利用管道符或者与或符号的等夹带其他命令进行执行
示例:127.0.0.1 | whoami
127.0.0.1 | dir
这里直接将输入的字符传入eval
结构中执行
可以直接输入代码执行,注意语法符号
phpinfo();
将变量传进来的值作为文件直接包含,这里本意是包含include
文件夹里的文件,但是因为没有对输入的变量做任何的处理,因此使用../
作为变量输入可以跳转到任意的目录中
在WWW
目录中新建一个1.php
文件,访问咸显示内容为phpinfo页面。构造包含语句,包含该文件
这项设置一般都是默认关闭的
远程文件包含和本地文件包含,源程序本质上没有什么区别,唯一的区别是是否开启了allow_url_include
,开启后可以通过http协议等远程包含文件
远程包含
这里直接将用户输入的参数作为要下载的文件路径,没有任何过滤
这里可以使用../
构造下载文件的路径,跳转到任意的目录,实现任意文件下载
成功下载mysql配置文件
这里后端没有对上传的文件做任何限制
但是在前端进行了上传文件类型的限制(检查后缀),只允许上传图片类的文件
抓包绕过就好了
成功上传
这里限制了允许上传的文件的MIME类型
抓包修改即可
这里服务端通过getimagesize函数检查上传图片的属性来判断是否上传合法的图片
虽然这个方法存在绕过的可能,但是这里上传的依旧为图片文件,要使其木马发挥作用需要配合文件包含漏洞
这里利用脚本生成,png的图片木马。上传后利用文件包含,成功执行命令
用户基本信息页面,在访问时,会检测是否登录,如果用户未登录则不允许访问
在检测到用户登录后,会通过变量输入的用户名查询用户的基本信息并显示在页面上。这里有一个问题,这里仅仅是检查了用户是否登录,但是并没有办法验证你输入的用户名是你本人。
登录kobe
账户
直接修改提交的用户为lili
,发现可以查看lilil
的信息
这里有pikachu和admin两个用户,其中admin为超级管理员,具有创建用户的权限。而pikachu则为普通管理账户只有查看已有账户的权限
这里造成漏洞的原因与1
很像,都没有校验用户的身份,只是校验用户登录与否。但1
是同权限的用户间进行越权,而这里是低权限用户到高权限的越权。这里不但要校验用户的身份还得校验用户的权限级别
这里我们使用普通用户pikachu登录后,直接可以访问admin用户才有权限的添加用户的功能
越权访问添加用户页面,(登录pikachu状态)直接修改路径即可
这里使用php require函数用于引入或者包含外部php文件,可以在执行流中插入写在其他文件中的有用的代码;当包含的外部文件发生错误时,系统将抛出错误提示,并且停止php文件的执行。
可以通过../
来遍历目录或文件,因为这个函数会抛出报错,可以利用这个报出绝对路径
靶机新建text.txt
由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
—通过访问url下的目录,可以直接列出目录下的文件列表;
—输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
—前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;
类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。
这里在源代码注释位置泄露了测试账号及密码
可以登录
这里S
类中定义了__construct()魔术方法,当一个对象创建时被调用,echo打印当前对象的test变量值
这里构造一个序列化的对象,将test变量值设置为XSS语句,服务端$s
接收到payload后传给unserialize反序列化,当反序列后输出XSS语句,浏览器弹窗
payload: O:1:"S":1:{s:4:"test";s:39:"";}
这儿运用了simplexml_load_string() 函数来处理接收到的xml实体。这个函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素。
对于输入的xml这里没有做任何过滤,直接就传入simplexml_load_string() 函数,并且在页面中输出结果
Xxe漏洞利用方式
任意文件读取
探测内网地址、端口
通过DTD窃取文件
远程代码/命令执行
这里利用这个漏洞读取文件
payload:
DOCTYPE ANY [ ]> <x>&f;x>
这里使用的是file协议,这里也可以使用http
协议或者php
伪协议等
如果要RCE则使用例如下列payload:
]>
&xxe;
XXE防御
1、使用开发语言提供的禁用外部实体的方法
1.PHP:
libxml_disable_entity_loader(true);
2.JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
3.Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2、过滤用户提交的XML数据
过滤关键词:
这里点击第四行文字时会有一个url
参数
这里url
参数接收到url后,header Location重定向到url,这里没有对url
参数做任何的过滤和限制
输入url
为哔哩哔哩网站
点击跳转
url跳转比较直接的危害是:
钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站
curl是PHP的一个扩展,curl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。
这里使用curl_exec()
执行一个cURL会话。$URL
未经任何过滤直接传入curl_exec()中,造成SSRF
这里的功能是info.php引用过来了显示在页面上
可以直接显示网站的根目录
也可以通过file等协议读取文件
示例:url=dict://192.168.198.1:21
这里使用了file_get_contents
函数来读取文件内容并显示下页面中。file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
这里同样可以通过file
等协议读取文件,受限于file_get_contents
函数,这里利用多是读取文件
这里演示使用php伪协议读取:php://filter/read=convert.base64-encode/resource=xxx.php