1.SQL注入
漏洞成因:
- 可控变量
- 变量会带入数据库查询
- 变量不存在过滤或者变量过滤不严格
注入流程
- 判断是否有注入点
- order by 判断字段数量
- union select 报错查看注入点
- 使用函数查看数据库相关信息
注入分类:
- 注入类型:报错、联合、盲注(布尔,时间)、堆叠
- 注入提交方式:get,post,cookie,文件头
堆叠注入判断
"id=1"正常
试试"id=1a",假设报错,说明数据没有被强转
在试试"id=1;"假设没有报错,说明";"没有被代入查询,而是当做了sql语句的结束符
那可能存在堆叠
sql注入写shell条件
知道web服务器的绝对路径
数据库具有root权限
secure_file_priv函数没有具体值
为null时,表示不允许导出导入,无法提权
为/tmp/时,限制导入导出只能在/tmp目录下,无法提权
没有具体值,不限制导入导出
提高盲注速率
- 提高sqlmap线程数:--threads
- 使用python盲注脚本
- 若盲注主机为window,且dns服务器配置有问题,可以使用dnslog注入
如何突破注入时字符被转义
- 宽字节注入
- hex编码绕过
盲注:
判断是否存在盲注
- 查看返回数据包字节长度大小判断
- 借助sleep函数判断
布尔盲注--逻辑判断
常用函数:regexp,like,ascii,left,ord,mid,substr
substr()函数是截取字符串的函数
regexp从左至右进行匹配,如果匹配成功则返回1,匹配失败则返回0
like函数:匹配字符串,与regexp相似
时间盲注--延时判断
常用函数:if,sleep
if(expr1,expr2,expr3);表达式
如果expr1判断为真,则返回expr2值,否则expr3的值
sleep被禁用可以使用benchmark()函数
宽字节注入
产生原因:
数据库使用了宽字符集(如GBK)但web没有考虑,例如在web层0x3f27是两个字符(?')当php中开启addslash时,会对0x27转义,因此变成0x3f5c27,数据进入数据库,由于0x3f5c是其他字符,所以转义字符就会被带走,从而单引号实现逃逸
根本原因:
客户端和连接层使用字符集不同,转换函数使用不当(iconv等)
解决方案:
统一使用字符集,对数据进行正确转义,如 mysql_real_escape_string+mysql_set_charset 的使用
报错注入:
定义:
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。
常用函数:
- updatexml:利用插入不符合函数格式的语句并拼接查询语句从而通过函数报错达到我们查询内容的目的;
- extractvalue:利用插入不符合函数格式的语句并拼接查询语句从而通过函数报错达到我们查询内容的目的;
以~,#开头的内容不是xml格式的语法,就会报错,但是会显示无法识别的内容是什么
- floor:是一个取整函数,原理:group by在向统计表插入数据时,由于rand()多次计算导致插入统计表时主键重复,从而报错
mysql的网站注入5.0以上和5.0以下有什么区别?
- mysql5.0以下没有information_schema库,不能获取列表名,只能暴力跑表名
- mysql5.0以下是多用户单操作
- mysql5.0以上是多用户多操作
udf提权
原理:
获取webshell是一个低权限用户,然后UDF提权就是利用MySql允许扩展自定义函数的特性,将webshell的权限变成和mysql运行权限一致
利用
利用root高权限,创建一个可以调用cmd的udf.dll动态链接库,导出文件后可以直接命令框使用cmd
sqlmap udf 提权:--udf-inject
MOF提权
原理:
mof的作用是每隔五秒监控一次进程的创建和死亡,因此可以在mof中写入恶意代码,进行提权
利用条件:
- 操作系统版本低于 win2008
- 可以通过mysql导出文件%SystemRoot%\System32\Wbem\MOF 文件夹下的MOF文件中,即需要mysql root权限以及secure_file_priv的值为空或者是%SystemRoot%\System32\Wbem\MOF路径
过程
将mof上传至任意可读可写目录下
然后使用sql语句将系统当中默认的nullevt.mof给替换掉。进而让系统执行我们这个恶意的mof文件。
mof编译方法:
- 将MOF文件执行为命令行参数及Mofcomp.exe文件
- 使用IMofCompiler接口和$CompileFile方法
- 拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹下的MOF文件中
MSsql提权
利用xp_cmdshell提权
原理:
xp_cmdshell允许在数据库服务器上执行操作系统级别的命令。当具有足够权限的用户在 SQL Server 中执行 xp_cmdshell 时,它会调用操作系统的命令解释器(例如,Windows 上的 cmd.exe)并执行指定的命令。通常用于执行一些与操作系统相关的任务,例如运行外部程序、执行文件操作、管理文件系统等。
提权过程
xp_cmdshell 默认在 mssql2000 中是开启的,在 mssql2005 之后的版本中则默认禁止。如果用户拥有管理员 sa 权限则可以用 sp_configure 重新开启它。
EXEC sp_configure 'show advanced options', 1
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;//若为零则为关闭
RECONFIGURE;
调用xp_cmdshell执行系统权限EXEC master.dbo.xp_cmdshell '命令'
利用sp_oacreate提权
原理
当xp_cmdshell被删除时,可以利用sp_oacreate(奥普瑞特)提权,他是用于在sql中创建和实例化com对象的存储过程中,利用创建的com对象中存在的漏洞或特权操作,就能获取更高权限
默认也是关闭状态
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;//若为零则为关闭
RECONFIGURE WITH OVERRIDE;
sp_oacreate执行命令是无回显的,使用dnslog平台进行判断
sql注入绕waf
- 注入空白字符:攻击者可以在注入语句中使用空格、Tab键、换行符等空白字符,从而绕过WAF的检测。
- URL编码:攻击者可以使用URL编码技术,将语句中的特殊字符进行编码,从而绕过WAF的检测。例如,将单引号编码为%27,将双引号编码为%22等。
- Unicode编码:攻击者可以使用Unicode编码技术,将注入语句中的特殊字符进行编码,从而绕过WAF的检测。例如,将单引号编码为%u0027,将双引号编码为%u0022等。
- 拆分注入:攻击者可以将注入语句拆分为多个短语或子句,从而绕过WAF的检测。例如,将SELECT关键字分成两个部分,使用空白字符分隔,如SEL ECT等。
- 盲注:攻击者可以使用盲注技术,通过检查应用程序的响应来获取有关注入结果的信息,从而绕过WAF的检测。盲注技术可以分为布尔盲注和时间盲注两种。
sql预编译
原理:将sql语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化。一次编译、多次运行,省去了解析优化等过程。
sql注入防范:
- 参数化查询:使用参数化的SQL查询,而不是动态拼接SQL查询字符串。这可以防止攻击者注入恶意代码,因为参数值会被视为数据而不是代码。
- 数据校验:对于输入数据,应该对其进行校验和过滤。例如,对于数字字段,应该只接受数字输入;对于字符串字段,应该过滤掉特殊字符和SQL关键字。
- 最小权限原则:应该使用最小权限原则来限制应用程序的访问权限。这样,即使攻击者成功地注入恶意代码,他们也只能访问应用程序有权访问的数据。
- 数据加密:对于敏感数据,应该使用数据加密来保护其安全性。这可以防止攻击者通过窃取数据库中的数据来获取敏感信息。
- 定期更新:应该定期更新数据库软件和应用程序代码,以修复已知的安全漏洞并增强系统的安全性。
2.文件包含
造成原理
文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击者会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。
php相应函数
- include():找不到包含文件就产生告警,继续运行
- require():找不到包含文件就停止运行
- include_once():与include类似,但只会包含一次
- require_once():与require类似,但只会包含一次
php伪协议
- file:// 用于访问本地文件系统
- php://filter 读取文件源码
常用于读取文件源码,使用文件包含函数包含文件时,文件中的代码会被执行,如果想要读取文件源码,可以使用base64对文件内容进行编码,编码后的文件内容不会被执行,而是展示在页面中,我们将页面中的内容使用base64解码,就可以获取文件的源码了 - php://input 任意代码执行
php://input 可以访问请求的原始数据,配合文件包含漏洞可以将post请求体中的内容当做文件内容执行,从而实现任意代码执行 - data://text/plain 任意代码执行
协议格式: data:资源类型;编码,内容
data://协议通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行 - zip:// 配合文件上传开启后门
zip://协议用来读取压缩包中的文件,可以配合文件上传开启后门,获取webshell将shell.txt压缩成zip,再将后缀名改为jpg上传至服务器,再通过zip伪协议访问压缩包里的文件,从而链接木马
文件包含分类
- 本地包含:仅能够对服务器本地的文件进行包含,主要可以用与读取本地敏感信息
- 远程包含:能够通过url地址对远程的文件进行包含
系统的敏感信息
Linux
/etc/passwd:包含本地用户的账户信息。
/etc/group:包含用户组的信息。
/etc/shadow:保存本地用户密码哈希值的文件。
/etc/sudoers:保存 sudo 命令权限的文件。
/proc/net/tcp:包含当前正在运行的 TCP 连接信息。
/var/log/auth.log:包含系统中用户认证和授权的日志信息。
应用程序配置文件:攻击者可能会尝试读取应用程序的配置文件,以获取数据库连接字符串等信息。
Windows
C:\Windows\system32\config\SAM:包含本地账户的哈希密码值。
C:\Windows\system32\config\SYSTEM:包含系统的配置信息。
C:\inetpub\wwwroot\web.config:包含 IIS 网站的配置信息。
C:\Program Files (x86)\MySQL\MySQL Server 5.7\my.ini:包含 MySQL 数据库的配置信息。
3.文件上传
漏洞成因
- 没有对上传的文件进行足够的验证和过滤。没有对上传的文件类型、大小、名称和内容进行严格的验证和过滤,从而允许攻击者上传任意类型、任意大小和任意内容的文件
- 没有对上传文件的保存路径和文件名进行控制。将上传的文件保存在与Web根目录相同的目录下,或者将上传的文件名保存为原始的文件名,从而允许攻击者通过上传包含恶意代码的脚本文件或具有危险文件名的文件来执行攻击。
- 没有对上传文件的访问权限进行限制。允许上传的文件在上传后具有完全的访问权限,从而允许攻击者通过访问上传的文件来获取或修改敏感数据。
绕过方法:
- 禁用js绕过
- 修改文件类型绕过
- 大小写,双写绕过
- 文件头绕过
- 二次渲染绕过
- 条件竞争绕过
- 00截断绕过:条件:php版本要小于5.3,魔术引号关闭(白)
- 配合解析漏洞绕过(白)
- 配合文件包含漏洞(白)
文件上传相关日志
- 文件上传日志:Web 服务器或应用服务器上的访问日志中可能包含上传文件的信息,例如上传时间、上传文件名称、上传文件大小等。
- 访问控制日志:如果应用程序实现了文件上传的访问控制机制,记录访问控制的日志可能包含了上传文件的信息,例如上传人员、上传时间、上传 IP 地址等。
- 安全审计日志:如果使用了安全审计工具,可以记录文件上传操作的详细信息,例如上传文件的路径、上传文件的内容等。
防护方法
- 文件类型和大小限制:在服务器端对上传的文件进行检查,确保上传的文件类型、大小和数量符合预期。可以使用白名单方式进行限制,只允许上传特定类型的文件。
- 检查文件内容:在服务器端对上传的文件进行检查,确保它们不包含恶意代码或病毒等危险内容。可以使用杀毒软件或安全扫描工具来帮助检查上传的文件。
- 重命名文件:将上传的文件保存在一个新的随机生成的文件名下,而不是使用用户提供的文件名。这样可以避免攻击者通过伪造文件名来欺骗用户。
- 存储位置:将上传的文件保存在与网站主目录分离的位置上,以避免攻击者上传Webshell等恶意脚本,并能够防止攻击者直接访问上传的文件。
- WAF防护产品
4.XSS
原理:
攻击者通过注入恶意脚本代码,将攻击者的代码注入到网站的页面中,当用户访问被攻击的页面时,就会执行这些恶意代码,从而导致攻击者获取用户的敏感信息
分类
- 反射型XSS:恶意脚本被注入到URL参数中,经后端程序处理后直接输出(使用短网址)
- 存储型XSS:恶意脚本被注入到数据库中,经后端程序处理后保存
- dom型XSS:攻击者通过修改页面的DOM节点,从而实现攻击的目的(不经过服务器,前端代码的利用)
xss利用
- 窃取用户cookie,从而获取用户信息
- 网页挂马:通过xss插入恶意js脚本(例如键盘记录功能)用户访问页面就同时执行恶意js
- 强制弹出广告页面
dom树标签
绕过方法
- 大小写绕过
- 双写绕过
- 关键字绕过
- 转换编码
xss常出现的地方
- 富文本编辑器
- 站点内用户之间私信
- 个人资料编辑
- 客服对话窗口
- 订单流程
防御:
- 输入过滤
a. 输入是否仅仅包含合法的字符
b. 输入字符串是否超过最大长度限制
c. 输入如果为数字,数字是否在指定的范围
d. 输入是否符合特殊的格式要求,如E-mail地址、IP地址等 - 输出转码:将HTML实体化编码
- 黑白名单
- 设置http-only(限制cookie劫持)php版本大于5.2
5.csrf
跨站请求伪造:利用用户在已登录的情况下访问恶意网站时,绕过同源策略,以用户身份执行未经授权的操作
同源:协议,ip,端口一致
同源策略浏览器在执行脚本前,会判断脚本是否与打开的网页是同源的,判断协议、域名、端口是否都相同,相同则表示同源。其中一项不相同就表示跨域访问
原理:
攻击者通过跨站请求(利用url短网站诱导点击),利用尚未失效的身份认证信息,以合法的用户身份进非法操作,简单来说盗用你的身份信息,向第三方网站发送恶意请求,包括利用你的身份发邮件,发短信,交易转账等。
类型
- GET类型的CSRF:通过构造一个包含受害网站的请求参数的URL,然后将这个URL发送给用户进行访问,当用户在浏览器中点击该链接时,浏览器会自动发出带有参数的GET请求
- POST类型的CSRF:构造一个包含受害网站的请求参数的表单,然后将这个表单发送给用户进行填写,当用户在浏览器中提交表单时,浏览器会自动发出带有参数的POST请求
挖掘
- 抓取正常请求数据包,查看是否存在referer字段或者token
- 如果有referer字段,删除再提交,若提交有效,则存在referer字段
- 使用相对应的检测工具,例如:CSRFTester
防御
- 验证HTTP Referer字段
- 在请求地址中添加token并验证
- 在HTTP头中加入自定义属性并验证
- 增加二次验证机制
与xss的区别
- CSRF需要用户先登录网站A,获取cookie; XSS不需要登录
- CSRF是利用网站A本身的漏洞,去请求网站A的api; XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。
- XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求