4、注入漏洞
注入类漏洞:SQL注入,xml注入,代码注入(以下内容为个人自学笔记)
一、SQL注入
SQL注入漏洞:SQL注入漏洞是web应用代码中的漏洞,黑客可以构造特殊的请求,使web应用执行带有附加条件的SQL语句,请求中带参数的值没有进行任何过滤,没有进行任何转码。通过特殊的请求,web应用向数据库访问时会附带其他命令(增删改查,更改权限等)
SQL注入影响:可以读取/修改库和表,可以执行系统命令(修改权限,更改文件,安装后门等)
SQL注入原理:SQL注入就是把SQL命令插入到Web表单然后提交到所在页面请求(查询字符串),从而达到欺骗服务器执行恶意的SQL命令。
(一)、SQL注入的类型:
1、简单注入:
(1)永真式:通过 and 1=1,来保障无论如何都能获取数据,后面通过--来注释掉
(2)错误语句:通过web应用构造错误的sql语句来显示错误,这里必须得有回显才能看见错误,这样能够判断数据库的类型。
(3)结束注释:使用注释符注释掉剩余的语句
(4)联合查询:使用union all,后面可以写我要查询的真正语句
下面为简单注入的常用方式
1' and 1=1; #,1 and 1=1; # 判断是否可以被注>1'or 1=1; # 来尝试获取全部账号信息
1' union all select 1,2;# 来判断可以获取的参数个数
1' union all select 1,(@ @version);#来获取数据库版本
1' union all select 1,(database();#获取数据库名称
1' union all select 1, group concat(column name) from information schema.columns where table name='users : #获取表所有列名
2、盲注:
即在SQL注入过程中,SQL语句执行查询后,查询数据不能回显到前端页面中,我们需要使用一些特殊的方式来判断或尝试,这个过程成为盲注。
需要掌握函数 substr用法(substr) 格式:substr(索引开始位,索引结束位) ,索引开始从1开始 ,ascii用法, length用法
(1)布尔盲注:布尔值只有true和false两个,布尔盲注的过程是
1、求当前数据库的长度以及ASCII
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and length(database()) = 8 --+,这里通过长度判断数据库的长度为8,--后面为注释
2、求当前数据库表的ASCII
求当前数据库表的ASCII 求当前数据库表中的个数 求当前数据库表中其中一个表的表名长度 求当前数据库中其中一个表的表名的ASCII 求列名的数量 求列名的长度 求列名的ascii 求字段的数量 求字段内容的长度 求字段内容的ascii
(2)时间盲注
时间盲注就是通过if 语句构造判断条件,是sleep函数来让数据库延迟查询,从而得到让网页加载时间变长的方式来猜解数据库。
if函数
if(expr1,expr2,expr3);表达式,如果expr1判断为真,则返回expr2值,否则expr3的值。
sleep函数,
sleep(duration) 这个函数的作用就是休眠,参数是休眠的时长,以秒为单位,也可以是小数
substr(string,start,length)函数是截取字符串的函数。
substr函数,截取字符串长度的函数
(二)各数据库的注入方式
>MySQL: IF(condition, true-part, false-part> SELECT IF(1=1,'true','false')
>MSSQL: IF condition true-part ELSE false-part>IF (1=1) SELECT true' ELSE SELECT false'> Oracle: BEGIN IF condition THEN true-part, ELSE false-part, END IF; END:> BEGIN IF (1=1) THEN dbms lock.sleep(3); ELSE dbms lock.sleep(0); END IF; END:
>字符串链接
>MSSQL: +
>MySQL,Oracle: ||
更多参考: https://www.netsparker.com/blog/web-security/sqinjection-cheat-sheet/
(三)、如何防范SQL注入
1、为什么会出现SQL注入漏洞?
答:(1)数据库可以运行系统命令
>用最小化权限的账户启动数据库
>进制让数据库执行系统命令
(2) 连接数据库的用户权限过大
>使用IDS,WAF等监控是否有异常操作
>连接数据库的用户权限最小化
(3) 错误信息返回过多的信息
>统一管理错误信息
>禁止向用户提供错误信息
(4) 在服务器未进行过滤
>过滤所有客户端数据
>审核数据
(四)、判断一个sql是否有注入?
1、 可控参数能否影响页面的显示结果
2、 输入的sql语句是否能够报错,看到的数据库的一些语句痕迹(select username,password from user where id = 4 and 0 #)
3、 输入的sql语句能否不报错-我们的语句能够成功闭合
二、XML注入
XML注入类似于SQL注入,XML文件一般用作存储数据及配置,如果在修改或新增数据时,没有对用户可控数据做转义,直接输入或输出数据,都将导致XML注入漏洞
如何防御XML注入:对用户输入进行检查;对特殊字符进行转码;
&--> &
<--> <
>--> >
"--> "
'--> '
三、代码注入
代码注入包含:远程文件包含漏洞,本地文件包含漏洞,命令执行漏洞
(一)远程文件包含漏洞
1、什么是远程文件包含漏洞
答:开发人员通常会把可重复的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般被成为包含,在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露或者恶意代码注入,如果PHP的配置选项allow_ul_include 为ON,则include/require函数可以加载远程文件,这种漏洞被称为远程文件包含漏洞。
2、远程文件包含漏洞用到的函数有哪些
答:include(),include_once(),require(),require_once(),fopen(),readfile()
3、远程文件包含漏洞的风险
答:可以利用代码注入操作服务器,操作数据库,插入恶意数据,获取系统权限,修改系统配置,网络配置,
4、远程文件包含漏洞代码审计方法
答:看是否有如下代码include(),include_once(),require(),require_once(),fopen(),readfile(),如果包含这些代码,就可能存在远程文件包含的漏洞。
5、修复远程文件包含漏洞方法
答:不需要执行远程代码时,可以修改php.ini配置,把all_ul_fopen=off,allow_ul_include=off;不要直接导入用户输入的内容,执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户只能提交"1、2、3”等参数,代表响应代码。
(二)本地文件包含漏洞
1、本地文件包含漏洞
2、用到得函数
答:include(),include_once(),require(),require_once(),fopen(),readfile()
3、利用方式:执行任意代码,包含恶意文件控制网站,上传图片码,读取PHP文件,读取系统敏感文件
4、php封装协议
答:file://---访问本地文件系统,文件系统是PHP使用得默认封装协议,展现了本地文件系统。
php://fileter--对本地磁盘文件进行读写
php://filter是一种元封装器,设计用于“数据流打开”时得筛选过滤应用,这对于一体式得文件函数非常有用,类似readfile()、file()、file_get_contens()、在数据流内容读取之前没有机会应用其他过滤器。
php://访问各个输入/输出流(I/O streams)PHP提供了一些项输入/输出(I/O流),允许访问PHP得输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读
data://伪协议是一种数据流封装器,data:URL schema,利用PHP中流的概念,将原本的include的文件流重定向到用户可控制的输入流中。
glob://伪协议,查找匹配的文件路径模式
5、本地漏洞修复方法
答:不要直接导入用户输入的内容,执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户只能提交“1、2、3”等参数,代表响应代码。
各种语言执行系统命令的函数
PHP:system()输出并返回最后一行shell结果;exec()不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面;passthru()只调用命令,把命令的运行结果原样输出到标准输出设备上。
JSP:runtime.getRuntime().exec(<commandstr>)
第三方执行存在的代码执行漏洞,struts2漏洞,可以使用action:","redirect:","redirectaction:"对输入信息进行处理,从而改变前缀参数,这样操作的目的时方便表单中的操作,在2.3.15.1版本以前的struts2中,没有对"cation:","redirectAction:"等进行处理,导致ongl表达式可以被执行。
命令注入漏洞的修复方法
PHP:
尽量不要执行外部命令,尽量使用脚本解决工作,少用执行命令函数,php中禁止disable_functions,使用自定义函数或函数库来替代外部命令的功能,程序参数的情况,escapshellcmd过滤,参数值escapeshellag过滤,参数值尽量使用引号包裹,并在拼接前调用addslashes进行转移,使用safe_mode_exec_dir指定可执行文件的路径
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)