web漏洞--注入漏洞

目录

1.Sql注入

2.Xml注入(xml实体注入,XXE)

3.远程文件包含漏洞

4.本地文件包含漏洞

5.命令注入漏洞


1.Sql注入

1.概念

1.SQL注入是一种Web应用代码中的漏洞。

2.黑客可以构造特殊数据库请求,使Web应用执行带有附加条件的SQL语句

  用户请求中使用了带有参数的值,但是没有进行任何过滤

  用户请求中使用了带有参数的值,没有进行任何转码

3.通过特殊的请求,Web应用向数据库访问时会附带其它命令:

  任意查询命令

  创建数据库/表

  更新数据库/表内容

  更改用户权限

  删除数据/表/数据库

  执行系统命令

2.原理

1.就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句。具体来说,它是利用现有应用程序,将SQL语句注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据,而不是按照设计者意图去执行SQL语句。

2.应用为了和数据库进行沟通完成必要的管理和存储工作,必须和数据库保留一种接口。目前的数据库一般都是提供api以支持管理,应用使用底层开发语言如 Php,Java,asp,Python与这些api进行通讯。对于数据库的操作,目前普遍使用一种SQL语言(Structured Query Language语言,SQL语言的功能包括查询、操纵、定义和控制,是一个综合的、通用的关系数据库语言,同时又是一种高度非过程化的语言,只要求用户 指出做什么而不需要指出怎么做),SQL作为字符串通过API传入给数据库,数据库将查询的结果返回,数据库自身是无法分辨传入的SQL是合法的还是不合法的,它完全信任传入的数据,如果传入的SQL语句被恶意用户控制或者篡改,将导致数据库以当前调用者的身份执行预期之外的命令并且返回结果,导致安全问题。

3.对于数据安全的影响

1.可读取/修改数据库中的库和表

  获取用户的账号,密码(可能被加密过),邮箱,联系方式

  信用卡信息

  修改产品价格

  删除数据

2.可执行系统命令

  修改权限,获取系统管理员权限

  修改任意文件

  安装后门

4.方法

 1.右边是一个登陆界面

  点击“submit”之后,web应用会执行:

    接收发送的POST请求

    获取用户名和密码:(bart, simpson)

    构建SQL语句:select * from users where username = 'bart' and password = 'simpson';

    发送给数据库服务器来验证

2.这个时候,我们可以对username进行变化

  输入的用户名不是简单的bart,而是 bart' and 1=1; --

  这样整个语句变成如下:

    select * from users where username = 'bart' and 1=1; -- ' and password = 'simpson';

  这个时候,--后面的都会变成注释,不用密码就能进行登陆。

5.类型

简单注入(simple SQL injection)

  永真式:最后加入 or 1=1 来保证无论如何都能获取数据。

  错误语句:让Web应用构造错误的SQL语句来抛异常,来判断数据库类型

  结束注释:使用注释符注释剩余语句

  联合查询:使用union all,后面可以写我要查询的真正语句

例子dvwa

  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' ; #    --获取表所有列名

盲注(Blind SQL injection)

  一般我们可以根据返回数据获取我们想要的信息。

  但一些页面,我们是获取不到详细信息。信息只有正确或不正确

6.SQL-Server、MySQL、ORACLE数据库的注入方法

1.注释符:--(MSSQL, MySQL),  #(MySQL),   /*comment*/(MySQL)

2.单行用分号隔开,运行多个SQL语句:MSSQL

3.判断(IF,ELSE语句)

  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;

4.字符串链接:

  MSSQL:+

  MySQL,Oracle: ||

7.安全防护

为什么会出现SQL注入漏洞?

数据库可以运行系统命令

  用最小化权限的账户启动数据库

  禁止让数据库执行系统命令

连接数据库的用户权限过大

  使用IDS,WAF等监控是否有异常操作

  连接数据库的用户权限最小化

错误信息返回过多的信息

  统一管理错误信息

  禁止向用户提供错误信息

在服务器没有进行有效的过滤,针对用户输入的特殊符号没有转码

  过滤所有客户端数据

  审核数据

8.一些SQL注入漏洞检测工具的使用

SQLMAP

  功能强大

  界面不友好

AWVS/APPScan/WebInspect

  可以查找各种类型的漏洞

  速度较慢

2.Xml注入(xml实体注入,XXE)

1.概念

XML注入类似于SQL注入,XML文件一般用作存储数据及配置,如果在修改或新增数据时,没有对用户可控数据做转义,直接输入或输出数据,都将导致XML注入漏洞。

2.产生的原因

XML注入产生的原因与SQL注入差不多。

  传输的数据包含了标签内容。

  修改数据时会覆盖原有的标签

3.检测与防护

对用户输入进行检查过滤

对特殊字符进行转码

  & --> &

  < --> <

  > --> >

  " --> "

  ' --> '

4.例子

服务器是生成XML来存储用户数据

<?xml version="1.0" encoding="UTF-8"?>
<USER role="guest"> 来宾用户
    <name>likui</name>  
    <passwd>123</passwd>
</USER>
<USER role="admin"> 管理员
    <name>admin</name>
    <passwd>1adtyr32e762t7te3</passwd>
</USER>

guest用户申请改密码,会更改123

要是用户提交的不是简单的字母组合,而是如下信息:

12345</passwd></USER><USER role="admin"><name>admin</name><passwd>123456</passwd></USER><!---

这样,配置文件会变成:

<?xml version="1.0" encoding="UTF-8"?>
<USER rule="guest">
    <name>user</name>
    <passwd>12345</passwd>
</USER>
<USER rule="admin">
    <name>admin</name>
    <passwd>123456</passwd>
</USER><!---</passwd>
</USER>
<USER role="admin">
    <name>admin</name>
    <passwd>1adtyr32e762t7te3</passwd>
</USER>

3.远程文件包含漏洞

1.概念

1.程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为包含

2.在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入。

3.如果PHP的配置选项allow_url_include为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。

2.PHP常见的导致文件包含的函数如下:

  include() 包含 重复调用

  include_once() 只有一次性调用

  require() 请求

  require_once()

  fopen()打开

  readfile()读取

3.利用方式

1.执行任意代码,来操作服务器

2.操作数据库,插入恶意数据,可能获取系统权限

3.修改系统配置,修改网络配置,可能对服务器及网络造成影响

4.代码注入攻击后可以进一步对网络渗透,由于代码注入攻击多半可获取系统权限,对网络的进一步渗透难度大大降低

4.代码审计方法

查看是否有如下代码:

  include(), include_once()

  require(), require_once()

  fopen()

  readfile()

5.修复方法

1.不需要执行远程代码时,可以修改php.ini配置:

  allow_url_fopen = Off

  allow_url_include = Off

2.不要直接导入用户输入的内容

  执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户3.只能提交“1、2、3”等参数,代表相应代码。

4.本地文件包含漏洞

1.概念

1.与远程文件包含漏洞类似,可以读取任意的本地文件

2.可以通过远程文件包含漏洞来生成本地文件包含漏洞的代码来利用

3.本地文件包含漏洞可以包含本地文件,在条件允许时甚至能执行代码

  上传图片马,然后包含

    读敏感文件,读PHP文件

    包含日志文件GetShell

    包含/proc/self/envion文件GetShell

    包含data:或php://input等伪协议

    若有phpinfo则可以包含临时文件

2.所用到的函数

与远程文件包含漏洞所用到的函数相同:

  include(), include_once()

  require(), require_once()

  fopen()

  readfile()

3.利用方式

1.漏洞危害:

  执行任意代码

  包含恶意文件控制网站

  甚至控制服务器

2.上传带有PHP代码的图片

  http://.../dvwa/vulnerabilities/fi/?page=../../../a.jpg

3.读取PHP文件

http://.../dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=../../../a.php

4.读取系统敏感文件

  http://.../dvwa/vulnerabilities/fi/?page=/etc/passwd

5.系统敏感文件有:

  Windows:

    C:\boot.ini   // 查看系统版本

    C:\Windows\System32\inetsrv\MetaBase.xml // IIS配置文件

    C:\Windows\repair\sam // 存储系统初次安装的密码

    C:\Program Files\mysql\my.ini // Mysql配置

    C:\Program Files\mysql\data\mysql\user.MYD // Mysql root

    C:\Windows\php.ini // PHP配置信息

    C:\Windows\my.ini // Mysql配置信息

    ... ...

  Linux:

    /root/.ssh/authorized_keys

    /root/.ssh/id_rsa

    /root/.ssh/id_ras.keystore

    /root/.ssh/known_hosts

    /etc/passwd

    /etc/shadow

    /etc/my.cnf

    /etc/httpd/conf/httpd.conf

    /root/.bash_history

    /root/.mysql_history

    /proc/self/fd/fd[0-9]*(文件标识符)

    /proc/mounts

    /porc/config.gz

4.PHP语言中的封装协议

1.访问本地文件

file:// — 访问本地文件系统

  文件系统是PHP使用的默认封装协议,展现了本地文件系统

php://filter -- 对本地磁盘文件进行读写

  php://filter是一种元封装器,设计用于“数据流打开”时的“筛选过滤”应用。这对于一体式(all-in-one)的文件函数非常有用,类似readfile()、file()、file_get_contens(),在数据流内容读取之前没有机会应用其他过滤器

2.代码任意执行

php:// — 访问各个输入/输出流(I/O streams)

  PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读

data://伪协议

  这是一种数据流封装器,data:URI schema(URL schema可以是很多形式)

  利用data://伪协议进行代码执行的思路原理和php://是类似的,都是利用了PHP中的流的概念,将原本的include的文件流重定向到了用户可控制的输入流中

3.目录遍历

glob://伪协议

  glob:// 查找匹配的文件路径模式

5.修复方法

1.不要直接导入用户输入的内容(与远程文件包含漏洞相同)

  执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户2.只能提交“1、2、3”等参数,代表相应代码。

5.命令注入漏洞

1.概念

1.用户通过浏览器提交执行命令,由于服务器没有针对执行函数做过滤导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码

2.在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

2.对系统安全产生的危害

1.继承Web服务程序的权限去执行系统命令或读 - 写文件

  运行Web服务的用户权限等于黑客利用漏洞后执行命令的权限

2.反弹shell

  通过特定方式进行反弹shell攻击

3.控制整个网站甚至控制服务器

  根据权限,可能服务器整体被沦陷

4.进一步内网渗透

  把当前控制的机器当作跳板来控制其它内网机器

3.脚本语言中可以执行系统命令的函数

1.PHP

  system() 输出并返回最后一行shell结果。 

  exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 

  passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。 

2.JSP

  Runtime.getRuntime().exec(<commandstr>)

4.第三方组件存在的代码执行漏洞

Struts2漏洞(s2-016)

  Struts2的DefaultActionMapper支持一种方法,可以使用”action:”, “redirect:” , “redirectAction:”对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的struts2中,没有对”action:”, “redirect:” , “redirectAction:”等进行处理,导致ongl表达式可以被执行。

详细信息请查找 s2-016

5.命令注入漏洞的修复方法

PHP

  尽量不要执行外部命令

  尽量使用脚本解决工作,少用执行命令函数,php中禁止disable_functions

  使用自定义函数或函数库来替代外部命令的功能

  程序参数的情况,escapshellcmd过滤

  程序参数值的情况,escapeshellarg过滤

  参数值尽量使用引用号包裹,并在拼接前调用addslashes进行转义

  使用safe_mode_exec_dir指定可执行文件的路径

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值