zwj611

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函数,截取字符串长度的函数

4.ord()函数
  ord(character)函数是返回一个字符的ASCII码。
5.length()函数
  length(string)函数是否返回一个字符串的长度。

(二)各数据库的注入方式

  注释符: --(MSSQL, MySQL),#(MySQL),/*comment*/(MySQL)(也就是说注释sql注入中可能存在的注释符有“--”,“#”,“/*comment*/”这三个)
  单行用分号隔开,运行多个SQL语句: MSSQL
  判断 (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:
  >字符串链接
  >MSSQL: +
  >MySQL,Oracle:  ||
  更多参考: https://www.netsparker.com/blog/web-security/sqinjection-cheat-sheet/
  Sql注入的按照请求方式主要有:get和post
 
  注入的类型:整型和字符型注入
  其他注入:
  报错注入:执行了错误的语句后在前台显示了,就是报错注入
  双注入:拼接sql语句是用到了两个select
  盲注入:布尔和时间盲注。
  cookie注入:在http请求的cookie中有注入就是cookie注入
  user-agent注入:就是在user-agent中存在注入,就是user-agent注入。、

   (三)、如何防范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注入:对用户输入进行检查;对特殊字符进行转码;

&--> &

<--> &lt;

>--> &gt;

"--> &quot;

'--> &#39;

三、代码注入

代码注入包含:远程文件包含漏洞,本地文件包含漏洞,命令执行漏洞

(一)远程文件包含漏洞

  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指定可执行文件的路径

 

posted on   yaphetss  阅读(212)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示