渗透测试之前,最重要的一步就是信息收集,在这个阶段,我们要尽可能的手机目标组织的信息。越是了解测试目标,更有利于测试工作的进行。在信息收集过程中,主要收集服务器的配置信息和网站的敏感信息,包括域名以及子域名信息、目标网站系统、CMS指纹、目标网站真实IP、开放的端口等。只要是与目标网站相关的信息,我们都应该尽量去收集。
得到了目标域名后,第一件事就是获取域名的注册信息。包括该域名的DNS服务器和注册人的信息等。域名信息收集的方法有以下几种。
Whois是一个标准的互联网协议,可用于收集网络注册信息,注册域名、IP地址等信息。在Whois查询中,得到注册人的姓名和邮箱信息通常对测试个人站点非常有用,可以通过搜索引擎和社交网络挖掘出域名所有人的很多信息。对于中小站点,域名所有人往往就是管理员。使用kali系统中的whois查询功能如下图所示:
在线的第三方whois查询网站还有爱站工具网、站长之家、VirusTotal,通过这些网站可以查询域名的相关信息,如域名服务商,域名拥有者,以及他们的邮箱、电话、地址等。
网站备案是根据国家法律规定,网站所有者需要向国家有关部门申请备案,这是国家信息产业部对网站的一种管理,为了防止在网上从事非法的网站经营活动的发生。主要正对国内。
常用的网站有以下这两个:
ICP备案查询网,
天眼查。
Google是世界上最强的搜索引擎之一,对于渗透测试者而言,它可能是一款绝佳的黑客工具。我们可以 通过构造特殊的关键字语法来搜索互联网上相关的敏感信息 。其常见用法及说明如下表:
关键字 | 说明 |
---|---|
site | 指定域名 |
inurl | URL中存在关键字的网页 |
intext | 网页正文中的关键字 |
filetype | 指定文件类型 |
intitle | 网页标题中的关键字 |
link | link:baidu.com 即表示返回所有和baidu.com做了链接的URL |
info | 查找指定站点的一些基本信息 |
cache | 搜索Google里关于某些内容的缓存 |
利用搜索引擎还可以收集数据库文件、SQL注入、配置信息、源代码泄露、未授权访问和robots.txt等敏感。
另外,通过burpsuite的repeater功能同样可以获取一些服务器信息,如运行server类型和版本、PHP版本信息等。针对不同的server,可以利用不同的漏洞进行测试。
除此之外,也可以尝试在github上寻找相关敏感信息。如数据库链接信息、邮箱密码、UC-key、阿里的osskey,有时还可以找到泄露的源代码等。
读者可以通过乌云漏洞列表查看历史漏洞信息。
如果目标网络规模较大,一般从其子域名入手。子域名收集方法常见以下几种。
常用的子域名收集工具有:Layer子域名挖掘机、K8、wydomain、Sublist3r、dnsmaper、subDomainsBrute、Maltego CE等。笔者重点推荐Layer子域名挖掘机、SubList3r和subDomainsBrute。
Layer子域名挖掘机使用较简单,只需要在域名对话框中直接输入域名即可,扫描结果显示包括域名、解析IP、CDN列表、Web服务器和网站状态等。
SubList3r可以列举多种资源,如Google、Yahoo、bing、百度等搜索引擎中可查到的子域名,还可以列出Netcraft、VirusTotal、ThreatCrowd、DNSdumpster和Reverse DNS查到的子域名。
subDomainsBrute的特点是可以用小字典递归发现三级、四级域名,用法如下:
python subDomainsBrute.py xxx.com
可以使用Google语法搜索子域名:site:xxx.com
很多使用第三方服务汇聚了大量DNS数据,它可以通过检索某个给定的子域名。只需要在其搜索栏中输入域名。也可以使用DNSdumpster网站、在线DNS侦查和搜索的工具挖掘出指定域潜藏的大量子域。
证书透明度是证书授权机构的一个项目,证书授权机构会将每个SSL/TLS证书发布到公共日志中。一个SSL/TLS证书通常包含域名、子域名和邮件地址,这些也经常成为攻击者非常希望获得的有效信息。查找某个域名所属证书的嘴就简单的方式就是使用搜索引擎搜索一些公开的CT日志。
推荐使用crt.sh和censys这两个网站。
除此之外、还可以利用一些在线网站查询子域名,如子域名爆破网站、IP反查绑定域名网站。
通过扫描服务器开放的端口及其对应的服务,可对症下药。使用的最常见工具是Nmap,还有无状态端口扫描工具Masscan、ZMap和御剑高速TCP端口扫描工具。
常见端口、服务描述及其攻击方式如下:
端口号 | 服务 | 攻击方式 |
---|---|---|
21/22/69 | ftp/tftp文件传输协议 | 允许匿名的上传、下载、爆破和嗅探 |
2049 | NFS服务 | 配置不当 |
139 | Samba服务 | 爆破、未授权访问、远程代码执行 |
389 | ldap | 目录访问协议 |
端口号 | 服务 | 攻击方式 |
---|---|---|
22 | SSH远程连接 | 爆破、SSH隧道及内网代理转发、文件传输 |
23 | Telnet远程连接 | 爆破、嗅探、弱口令 |
3389 | rdp远程桌面连接 | shift后门(Windows server2003以下)、爆破 |
5900 | VNC | 弱口令爆破 |
5632 | PyAnywhere服务 | 抓密码、代码执行 |
端口号 | 服务 | 攻击方式 |
---|---|---|
25 | SMTP邮件服务 | 邮件伪造 |
110 | POP3协议 | 爆破、嗅探 |
143 | IMAP协议 | 爆破 |
端口号 | 服务 | 攻击方式 |
---|---|---|
53 | DNS域名系统 | 允许区域传递、DNS劫持、缓存投毒、欺骗 |
67/68 | DHCP服务 | 劫持、欺骗 |
161 | SNMP协议 | 爆破、收集目标内网信息 |
端口号 | 服务 | 攻击方式 |
---|---|---|
2181 | Zookeepr服务 | 未授权访问 |
8069 | Zabbix服务 | 远程执行、SQL注入 |
9200/9300 | Elasticsearch服务 | 远程执行 |
11211 | Memcache服务 | 未授权访问 |
512/513/514 | Linux Rexec服务 | 爆破、Rlogin登录 |
873 | Rsync服务 | 匿名访问、文件上传 |
3690 | Svn服务 | Svn泄露、未授权访问 |
50000 | SAP Management Console | 远程执行 |
指纹信息指网站CMS指纹识别、计算机操作系统及web容器的指纹识别等。
根据一些特定文件中的某些特征,就可以判断出使用的CMS。
渗透测试中有必要对其进行指纹识别,识别出指纹就可以更好的进行相关漏洞的测试。
CMS又称整站系统或文章系统。常见的CMS有dedecms(织梦)、Discuz、PHPWEB、PHPWind、PHPCMS、ECShop、Dvbbs、SiteWeaver、ASPCMS、帝国、Z-Blog、WordPress等。
代表工具:御剑Web指纹识别、WhatWeb、椰树、轻量Web指纹识别等。在线工具:BugScaner,云悉指纹,WhatWeb。
首先判断目标是否使用了CDN,可以通过ping测试判断。
如果可知目标没有使用CDN,可以直接通过www.ip138.com获取目标的一些IP及域名信息。
如果使用了CDN,需要绕过CDN来找到CDN。可以通过如下几种方法来进行绕过CDN:
渗透测试中,探测目录结构和隐藏的敏感文件是必不可少的。这波操作可能会获得后台管理页面,文件上传页面,以及网站源代码等。
工具有:DirBuster、御剑后台扫描珍藏版、wwwscan、Spinder.py(轻量级快速单文件目录后台扫描)、Sensitivefilescan(轻量级快速单文件目录后台扫描)、Weakfilescan(轻量级快速单文件目录后台扫描)等。
DirBuster的使用:
要求使用java环境
在target URL输入目标地址
请求方式:auto
线程:20-30
URL to full:/{dir} 这里{dir}是一个变量,表示字典里的每一行。
如果扫描的是http://www.xxx.com/admin/,那么URL to fuzz填:/admin/{dir}
若输入:/admin/{dir}.php,表示admin下面所有的php文件。
除此以外,还可以使用WebScan等第三方工具。
一方面可以通过社工方法获取一些相关信息。
另一方面也可以通过社工库查询一些信息。
SQLmap是一个自动化的SQL注入工具
主要功能:扫描、发现并利用给定的URL的SQL注入漏洞。包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。
支持数据库:MySQL、Oracle、PostgreSQL、SQL server、Access、DB2、SQLite、Firebird、Sybase、SAP MaxDB。
包含的注入技术:
略
1.判断是否存在注入
sqlmap.py -u http://target?id=1
当目标有多个参数时,需要加双引号
sqlmap.py -u "http://target?id=1&uid=2"
2.判断文本中是否存在注入
从文件中加载HTTP,SQLMAP可以从一个文本中获取HTTP求情,这样就可以不设置其他参数(cookie,post数据等),txt文件中的内容为Web数据包。
sqlmap.py -r target.txt
3.查询当前用户下的所有数据库
sqlmap.py -u http://target?id=1 --dbs
4.查询某个数据库中的表名
sqlmap.py -u http://target?id=1 -D xxx --tables
5.获取某数据库中某表的字段
sqlmap.py -u http://target?id=1 -D xxx -T xxx --columns
6.获取字段内容
sqlmap.py -u http://target?id=1 -D xxx -T xxx -C xxx,xxx --dump
7.获取数据库中所有用户
sqlmap.py -u http://target?id=1 --users
8.获取数据库用户的密码
sqlmap.py -u http://target?id=1 --passwords
9.获取当前网站数据库的名称
sqlmap.py -u http://target?id=1 --current-db
10.获取当前数据库用户名称
sqlmap.py -u http://target?id=1 --current-user
共1-5五个等级,默认为1,SQLmap使用的payload在xml/payload.xml中,也可以根据响应的格式添加自己的payload。5级包含色payload最多,可自动破解cookie、XFF等头部注入。cookie在level2的时候会测试,http useragent/referer在level3的时候会测试。
sqlmap.py -u http://target?id=1 --is-dba
如果当前用户有权限读取包含所有用户的表,输入该命名会列出每个用户的角色。也可以使用-U参数指定查看哪个用户的角色。
可以自定义Referer头进行欺骗,level3及以上会对Referer进行注入测试。
该命令用于执行指定的SQL语句
sqlmap.py -u http://target?id=1 --sql-shell
在数据库为MySQL、PostpostgreSQL、SQL Server,并且当用户有权限使用特定的函数时,如果数据库为MySQL、PostgreSQL,SQLmap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么创建这两个函数就可以执行系统命令。在SQLserver中,SQLmap将使用xp_cmdshell存储过程、如果被禁用(SQLserver2005及以上默认关闭),则SQLmap会从新启用它;如果不存在,会自动创建。
用–os-shell参数可以模拟一个真实的shell,输入想执行的命令。当不能执行多语句时(比如PHP和asp的后端数据库为MySQL),仍然可以使用INTOOUTFILE写进可写目录,创建一个Web后门。–os-shell支持ASP、ASP.NET、JSP和PHP四种语言(要想执行该参数、需要由数据库管理员权限,也就是–is-dba的值为true)
该命令用于读取执行文件,在数据库为MySQL、PostpostgreSQL、SQL Server,并且当用户有权限使用特定的函数时,读取的文件可以是文本,可以是二进制文件。
sqlmap.py -u http://target?id=1 --file-read "C:/example.exe"
该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或SQLserver,并且在当前用户有权限使用特定函数时,上传的文件可以是文本,也可以是二进制文件。
tamper参数对数据做修改来绕过waf等设备,其中大部分脚本主要使用正则模块替代攻击载荷字符编码的方式绕过waf的检测规则。
sqlmap.py -u http://target?id=1 --tamper "模块名"
作用:将引号替换为UTF-8,用于过滤单引号。
作用:替换为base64编码
作用:围绕SQL关键字添加多个空格
作用:用加号替换空格
作用:作为双重查询语句,用双重语句替代预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将select替换为空)。
作用:将空格替换为其他有效字符。
作用:将UNION ALL SELECT替换为UNION SELECT
作用:追加特制的字符串。
作用:将空格替换为#号,并添加一个随机字符串和换行符。
作用:将空格替换为其他空符号
作用:将空格替换为#号,并添加一个换行符。
作用:用NOT BETWEEN 0 AND 替换大于号(>),用BETWEEN AND 替换等于号(=)
作用:ASP允许在每个字符前面加上一个%。
作用:从DBMS日志的自动模糊处理的有效载荷中追加sp_password。
作用:对给定的payload全部字符使用URL编码(不处理已编码的字符)。
作用:随机大小写。
作用:字符串Unicode编码。
作用:将空格替换为/**/。
作用:将等号替换为like。
作用:绕过对“>”的过滤,用GREATEST替换大于号。测试通过的数据库有MySQL4、MySQL5.0、MySQL5.5、Oracle 10g、PostgreSQL 8.3、PostgreSQL8.4、PostgreSQL 9.0。
作用:绕过对IFNULL的过滤,替换类似IFNULL(A,B)为IF(ISNULL(A),B,A)。测试通过的数据库类型版本有MySQL5.0、MySQL5.5。
作用:过滤空格,使用MySQL内联注释方式注入。测试MySQL5.0可行。
作用:将空格替换为其他空白符号(MySQL5.1测试通过)
作用:使用MySQL内联注入方式(/! 00000/)进行注入。(mysql5.0测试通过)
作用:将空格替换为–,并添加一个换行符。
作用:在SQL语句之后用有效的随机空白符替换空格符,随后用like替换等于号。
通过测试的数据路和版本为MySQL5.1和SGOS。
作用:注释绕过
作用:当数据库为Mysql时绕过防火墙,在每个关键字前面添加MySQL版本注释。测试通过的数据库类型和版本有MySQL4.0.18和MySQL5.0.22。
作用:将空格替换为#号,并添加一个随机字符串和换行符。测试通过的数据库和版本有MySQL5.1.41。
作用:在有效负荷的结束位置加载零字节字符编码。
作用:对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)。
作用:用一个多字组合(%bf%27)和末尾通用注释一起替换空格。
作用:用/**/分割SQL关键字。
最好掌握tamper插件的编写规则,这样在应对各种实战环境时候才能更加自如。
略
Proxy是利用burp开展测试流程的核心,通过代理模式,可以让我们拦截、查看、修改所有在客户端和服务器之间传递数据。
拦截功能主要由intercept选项卡中的forword、drop、interception is on/off和action构成。
burp有四种消息类型显示数据包:
spider爬虫可以帮我们更加了解系统结构,其中spider爬取到的内容将在target中展示。
对原始数据进行各种编码格式和散列的转换。
用于自动检测Web系统的各种漏洞。
主动扫描:burp会向应用发送新的请求并通过payload验证漏洞。会产生大量的请求和应答数据,直接影响服务器性能,不适合在生产环境使用。主要使用以下两类漏洞。
被动扫描:burp不会重新发送新的求情,只是对已存在的请求和应答进行分析,对于服务器端来讲,比较安全,适合用于生产环境的检测。一般来说,下列漏洞在被动模式下容易被检测出来:
intruder是一个高度可配置的工具,可以对Web应用程序进行自动化攻击,如通过标识符枚举用户名、ID和账户号码,模糊测试,SQL注入,跨站,目录遍历等。
原理:在原有请求的基础上,通过修改各种请求参数获取不同的请求应答。
常用场景:
攻击模式
手动修改、补发个别HTTP请求,并分析其响应的工具。通常和其他工具结合起来使用。
Repeater分析选项有四种消息类型:
提供可视化的差异对比功能,来对比分析两次数据之间的区别。使用场景有:
数据加载的常用方式:
用于分析样本随机性质量的工具。可以用它测试应用程序的会话令牌(Sesion token)、密码重置令牌是否可预测等场景。通过数据样本分析,可以很好的降低关键数据被伪造的风险。
被设计用来快熟扫描大型网络,包括主机探测与发现、开放的端口情况、操作系统与应用服务指纹识别、WAF识别及常见安全漏洞。图形化界面为Zenmap,分布式框架为Dnmap。
nmap特点如下所示:
略
例如:blah.highon.coffee, namp.org/24, 192.168.0.1;10.0.0-25.1-254
nmap ip
扫描多个目标地址
nmap ip1 ip2
扫描一个网段
nmap ip1-ip2
扫描某个地址的网段
nmap ip/24
扫描主机列表targets.txt中的所有目标地址
nmap -iL targets.txt
扫描某一个目标地址之外的其他目标地址
nmap ip1/24 -exclude ip2
扫描除了某一文件中目标地址之外的目标地址
nmap ip1/24 -excludefile targets.txt
扫描某一目标地址的21、22、23、80端口
nmap -p 21,22,23,80 ip
对目标地址进行路由跟踪
nmap --traceroute ip
扫描目标地址所在C段的在线情况
nmap -sP ip/24
目标地址操作系统的指纹识别
nmap -O ip
目标地址提供的服务版本检测
nmap -sV ip
探测防火墙状态
nmap -sF -T4 ip
nmap输出为扫描列表,包括端口号、端口状态、服务名称、服务版本及协议。
通常状态有六种:
状态 | 含义 |
---|---|
open | 开放,表示应用程序正在监听该端口的链接,外部可以访问 |
filtered | 被过滤,表示端口被防火墙或其他设备阻拦,无法访问 |
closed | 关闭,表示端口未开启 |
unfiltered | 未被过滤,表示nmap无法确定端口所处的状态 |
open/filtered | 开放或被过滤,nmap不能识别 |
closed/filtered | 关闭或被过滤,nmap无法识别 |
nmap的脚本默认存放在…/nmap/scripts/下面。
auth: 负责处理鉴权证书(绕开鉴权)的脚本
broadcast: 在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务
brute: 提供暴力破解方式,针对常见的应用如http/snmp等
default: 使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力
discovery: 对网络进行更多的信息,如SMB枚举、SNMP查询等
dos: 用于进行拒绝服务攻击
exploit: 利用已知的漏洞入侵系统
external: 利用第三方的数据库或资源,例如进行whois解析
fuzzer: 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞
intrusive:入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
malware: 探测目标机是否感染了病毒、开启了后门等信息
safe: 此类与intrusive相反,属于安全性脚本
version: 负责增强服务与版本扫描(Version Detection)功能的脚本
--script=defualt:使用默认的脚本进行扫描
--script=:使用某个脚本进行扫描
--script-args=key1=value1,key2=value2:为脚本传递参数
--script-args-file=filename:使用文件向脚本传递参数
--script-trace:显示脚本执行过程中发送和接收的数据
--script-updatedb:更新脚本库数据‘’
--script-help:显示对应脚本帮助信息
使用–script=auth可以对目标主机或目标主机所在网段进行应用弱口令。
nmap --script=auth ip
可对数据库、SMB、SNMP进行简单的密码暴力猜解
nmap --script=brute ip
可检测目标主机或网段是否存在常见漏洞
nmap --script=vuln ip
nmap具备很多常见应用服务的脚本,如VNC、MySQL、telnet、rsync等
nmap --script=realvnc-auth-bypass ip
nmap -n -p 445 --script=broadcast ip
nmap -script external 域名
Web应用程序对用户输入的数据合法性没有判断,前端传入后端的参数是攻击可控的,并且参数带入数据库查询,攻击者可以构造不同的SQL语句来实现对数据库的任意操作。
SQL注入漏洞产生的条件
select * from users where id = 1'
这不符合数据库语法规范,会报错。当传入参数为 1 and 1=1 时,执行的SQL语句如下图所示:
select * from users where id = 1 and 1=1
因为1=1为真,且where语句中 id=1 也为真,所以页面会返回与 id=1 相同的结果。当传入的id参数为 1 and 1=2时,由于1=2不成立,所以返回假,页面就会返回与 id=1 不同的结果。
由此可初步判断SQL注入漏洞的存在。
MySQL默认在数据库中存放有一个“information_schema”数据库。我们需记住其中的三个表:SCHEMATA、TABLES、COLUMNS
。
SCHEMATA存储该用户创建的所有数据库的库名,需记住里面记录数据库库名的字段名为:SCHEMA_NAME
。
TABLES存储用户创建的所有数据库的库名和表名,需记住TABLE_SCHEMA
和TABLE_NAME
这两个字段。
COLUMNS存储该用户创建的所有数据库的库名、表名和字段名,须记住TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME
。
不知道条件
SELECT 想要查询字段名 FROM 数据库名.表名
知道一个条件
SELECT 想要查询字段名 FROM 数据库名.表名 WHERE 已知条件字段名='已知条件的值'
知道两个条件
SELECT 想要查询字段名 FROM 数据库名.表名 WHERE 已知条件字段名='已知条件的值'
limit的使用格式是limit m,n
,表示选取从m
位置开始取n
个元素。m
从0
开始。
datebase():当前网站使用的数据库
version():当前MySQL版本
user():当前MySQL的用户
MySQL中,常见注释符的表达方式:#或–空格或/**/。
内联注释的形式:/! code/。内联注释可以用于整个SQL语句中,用来执行我们的SQL语句。
index.php?id=-15/*! UNION*//*! SELECT*/1,2,3
以DVWASQL注入来演示:
当输入为1
时显示如图所示:
然后输入为1’时,报出如下错误:
由报错信息可判断出该处参数值为单引号字符型。
然后输入1' and '1'='1
,结果显示和输入1
时相同:
再输入1' and '1'='2
,结果未正常显示:
由此可判断此处可能存在注入,尝试判断该表的字段数量:
①输入1’ order by 2#,结果可正常显示