因为是迁移过来的,图崩了的话看原帖:https://www.yuque.com/lola39/hyqxgz/hs5p8q

一. 信息泄露

  1. 默认账户:
    数据库软件;集成开发环境;CMS内容管理系统;路由器管理界面;摄像头管理界面等。
  2. 后台/服务对外开放:后台地址泄露;后台地址可被爆破;后台未作授权;敏感服务未做访问限制;直接可以访问等。
  3. DEBUG信息:为了开发人员能快速定位错误的代码,脚本配置文件打开错误提示选项;DEBUG信息可能会透露部分代码、绝对路径等信息。
  4. 目录列表:Index of /xxx/xxx

    例如Nginx目录遍历(配置不当):vim /etc/nginx/sites-available/default在location这里加上autoindex on;

    修复方法:autoindex on 修改成 autoindex off
  5. 备份文件:.bak等相关备份文件;.zip等相关压缩命令产物;.tar.gz、.tar等tar命令的产物;.sql等相关数据库等。
  6. 系统产生的临时文件:.tmp文件;.swp文件;.DS_Store等。
  7. GIT泄露:分布式版本控制系统;隐藏仓库文件夹.gif文件夹;还原仓库文件等。
  8. SVN泄露:集中式版本控制系统;隐藏仓库文件夹.svn文件夹;还原仓库文件等。

二. XSS跨站脚本

  1. 概念:

    跨站脚本 (Cross-Site Scripting, XSS) 是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码 (HTML代码/JavaScript脚本) 注入到网页之中。当其他用户浏览这些网页时,就会执行其中的恶意代码。主要可以对用户 Cookie 资料窃取、会话劫持、钓鱼欺骗等各种攻击。
  2. xss的分类:

    ■ 反射型xss:

    反射型跨站脚本 (Reflected Cross-site Scripting) 也称作非持久型、参数型跨站脚本。

    主要用于将恶意脚本附加到URL地址的参数中。

    例如:

    http://127.0.0.1/index.php?name=<script>alert("XSS")</script>

    ■ 持久型xss:

    持久型跨站脚本 (Persistent Cross-site Scripting) 或称作存储型跨站脚本 (Stored Cross-site Scripting)

    此类XSS不需要用户单击特定URL就能执行跨站脚本。攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中。当受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。

    ■ DOM型xss:

    测试payload:' onclick="alert("XSS")">

三. CSRF

  1. 简介:

    CSRF (Cross-site request forgery:跨站请求伪造) 也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
  2. 原理总结:

    (1)、有一个漏洞存在(无需验证、任意修改后台数据、新增请求);

    (2)、伪装数据操作请求的恶意链接或者页面;

    (3)、诱使用户主动访问或登录恶意链接,触发非法操作;
  3. 场景:

    用户密码的修改、购物地址的修改或后台管理账户的新增等等操作过程中。
  4. 防御:

    对关键操作进行二次验证
  5. 参考资料:

    https://blog.csdn.net/xiaoxinshuaiga/article/details/80766369

四. SSRF

  1. 简介:

    SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统,正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。
  2. 形成原因:

    由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制,比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
  3. 常见危害:

    (1).可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的Banner信息等;

    (2).攻击运行在内网或本地的应用程序(比如溢出);

    (3).对内网Web应用进行指纹识别,通过访问默认文件实现  (Readme等文件);

    (4).攻击内外网的Web应用,主要是使用GET就可以实现的攻击 (比如Struts2,SQLI等);

    (5).利用File协议读取本地文件等。
  4. 常见应用场景:

    分享;在线翻译;图片加载与下载;图片、文章收藏功能;未公开的API实现以及其他调用URL的功能等。
  5. 防御:

    (1)、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

    (2)、 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

    (3)、限制请求的端口为http常用的端口,比如,80,443,8080,8090。

    (4)、黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

    (5)、禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
  6. 参考资料:

    https://www.freebuf.com/articles/web/20407.html

五. SQL注入

  1. 常用数据库模型:

    ➢ 关系型数据库:关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。通过SQL结构化查询
    语句存储数据,保持数据一致性,遵循ACID理论(ACID, 指数据库事务正确执行的四个基本要素的缩写包含:原子性(Atomicity) 、-致性(Consistency) 、隔离性(Isolation) 、持久性(Durability) )。

    关系型数据库的典型产品:MySQL、SQLServer、 Oracle等。

    ➢ 非关系型数据库:非关系型数据库也被成为NoSQL数据库,NOSQL的本意是"Not OInly SQL"指的是非关系型数据库,
    而不是"NoSQL"的意思,因此,NoSQL的产生并不是要彻底地否定非关系型数据库,而是作为传统
    关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
    NOSQL典型产品: memcached (纯内存) 、redis (持久化缓存)、mongodb (文档的数据库)。
  2. 本质:对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。

    两个条件:用户能够控制输入;原本程序要执行的SQL语句,拼接了用户输入的恶意数据。
  3. 危害:

    绕过登录验证:使用万能密码登录网站后台等。

    获取敏感数据:获取网站管理员帐号、密码等。

    文件系统操作:列目录,读取、写入文件等。

    注册表操作:读取、写入、删除注册表等。

    执行系统命令:远程执行命令。
  4. 原因:

    (1). 动态字符串构建引起:

    不正确的处理转义字符(宽字节注入)

    不正确的处理类型(报错泄露信息)

    不正确的处理联合查询

    不正确的处理错误(报错泄露信息)

    不正确的处理多次提交(二次注入)

    (2). 后台存在的问题:

    后台无过滤或者编码用户数据

    数据库可以拼接用户传递的恶意代码

    (3). 错误处理不当:

    详细的内部错误消息显示给用户或攻击者

    错误信息可以直接给攻击者提供下一步攻击帮助

    (4). 不安全的数据库配置:

    ➢ 默认账户:

    SQL Server“sa”作为数据库系统管理员账户

    MySQL使用“root"和 “anonymous"用户账户

    Oracle则在创建数据库时通常默认会创建SYS、SYSTEMS DBSNMP和OUTLN账户

    ➢ 权限问题:

    系统和数据库管理员在安装数据库服务器时允许以rootsSYSTEM或Administrator
    特权系统用户账户身份执行操作

    ➢ 正确方法:

    应该始终以普通用户身份运行服务器.上的服务,降低用户权限,将用户权限只限于本服务
  5. 自动化注入工具:

    (1). SQL注入工具:

    Sqlmap、Havij、Sqlid

    (2). ASP\JSP注入工具:

    NBSI、阿D注入软件、明小子注入软件

    (3). PHP注入工具:

    穿山甲注入软件、海阳顶端注入软件
  6. 手工注入过程:

    (1). 判断是否存在注入点

    (2). 判断字段长度

    (3). 判断字段回显位置

    (4). 判断数据库信息

    (5). 查找数据库名

    (6). 查找数据库表

    (7). 查找数据库表中所有字段以及字段值

    (8). 猜解账号密码

    (9). 登陆管理员后台
  7. 常见SQL语法操作:

    CREATE
    创建新的表、视图或其他数据库中的对象

    ALTER
    修改现存数据库对象,比如一张表

    DROP
    删除表、视图或者数据库中的其他对象

    SELECT
    从一张或者多张表中检索特定的数据

    INSERT
    创建一条新记录

    UPDATE
    修改记录

    DELETE
    删除记录

    GRANT
    赋予用户特权

    REVOKE
    收回赋予用户的特权
  8. SQL高级操作:

    ➢ 排序 order by

    SELECT * FROM test_table ORDER BY userid

    ➢ 分组 group by

    SELECT name,COUNT(*) FROM test_table GROUP BY name

    ➢ 限定条数 limit

    SELECT * FROM test_table limit 0,10

    SELECT * FROM test_table limit 1,5

    ➢ 组合使用

    SELECT * FROM test_table LIMIT 0,5 ORDER BY userid

    ➢ 联合查询 union

    因为查询语句构造问题,可直接否认掉之前的查询,执行一个全新的语句来执行 ,需要注意的是查询的列应当和之前对应

    ➢ 结合其他函数操作

    在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库

    其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据
    库的表,表栏的数据类型与访问权限等

    information_schema 数据库是MySQL自带的

    informat ion_schema. SCHEMATA表中的SCHEMA_NAME查看所有的数据库:

    select * from hehe where id=3 and 1=2 union select 0, 0, SCHEMA NAME from informati on_schema. SCHEMATA limit 1, 2
  9. 注入类型:

    ■ 报错型盲注:

    (1). 数字型注入:输入的参数为整数,如ID、年龄、页码等,如果存在注入型漏洞,则为数字型注入

    http://www.testweb.com/user.php?id=8

    (2). 字符型注入:输入的参数为字符串
    与数组型注入的区别在于:字符型注入一般要使用单引号或双引号等来闭合

    http://www.testweb.com/test.php?user=admin

    ■ 布尔盲注

    某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,所以其返回可以看做一个布尔值,正常显示为true, 报错或是其他不正常显示为false.

    查询语句

    SELECT userid FROM member WHERE u_name= $name AND u_pass=$pass;

    注入语句

    name=-1' and (select mid(u_name,1,1) from member where userid=1)='a'

    name=-1' and (select mid(u_name,2,1) from member where userid=1)='d'

    name=-1' and (select mid(u_name,3,1) from member where userid=1)='m'

    name=-1' and (select mid(u_name,4,1) from member where userid=1)='i'

    name=-1' and (select mid(u_name,5,1) from member where userid=1)='n'

    ■ 时间盲注

    某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,, 但是由于某些限制,布尔盲注的关键字符带入不进去,这时候可以使用sleep来进行时间盲注,取面执行时间(结束时间-开始时间)来判断sleep函数是否正常执行,所以其是否正常执行可以看做一个布尔值,正常显示为true ,报错或是其他不正常显示为false查询语句

    SELECT userid FROM member WHERE u_name= $name AND u_pass= $pass;

    注入语句

    name=-1' and (select mid(u_name,1,1) from member where userid=1)='a' and (select sleep(3))

    name=-1' and (select mid(u_name,2,1) from member where userid=1)='d' and (select sleep(3))

    name=-1' and (select mid(u_name,3,1) from member where userid=1)='m' and (select sleep(3))

    name=-1' and (select mid(u_name,4,1) from member where userid=1)='i' and (select sleep(3))

    name=-1' and (select mid(u_name,5,1) from member where userid=1)='n' and (select slee(3))

    基于时间的盲注在使用延迟函数上可以有两个选择:

    (1). BENCHMARK(count,expr)函数

    (2). sleep(time)函数

    前者通过将expr语句执行count次来达到延迟的目的,后者是直接延迟time时间

    ■ 常见的HTTP Header注入:

    Cookie注入、Referer注入、UA注入、XFF头注入

    HTTP Header内容:

    ➢User-Agent: 使得服务器能够识别客户使用的操作系统,游览器版本等. (很多数据量大的网站中会记录客
    户使用的操作系统或浏览器版本等存入数据库中)

    ➢Cookie: 网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密).

    ➢X-Forwarded-For: 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP, (通常一些网站的防注入功
    能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]).

    ➢Clien-IP: 同上.

    ➢Rerferer: 浏览器向WEB服务器表明自己是从哪个页面链接过来的.

    ➢Host: 客户端指定自己想访问的WEB服务器的域名/IP地址和端口号.

    ■ 宽字节注入:

    统一的国际规范的理想:程序都使用unicode编码,所有的网站都使用utf-8编码。

    国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。也有一些cms为了考虑老用户,所以出了gbk和utf-8两个版本。

    一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。简体中文系统中ANSI就代表是GBK。

    利用场景:

    加单引号没有报错,在’也就是%27前面加了一个%df就报错了.原因是多了一个单引号,而单引号前面的反斜杠不见了。

    输入id=1' 转义过滤后 id=1'

    输入id=1%df' 转义过滤后 id=1 %df' ld=1%df%5c%27

    gbk是多字节编码,他认为两个字节代表一个汉字,所以%df
    和后面的\也就是%5c变成了一个汉字“運”,而’逃逸出来.

    %df --> ?
  10. SQL注入检测绕过:

    ■ 大小写绕过

    比如拦截了union,那就使用Union UnIoN等等。

    ■ 编码绕过

    WAF检测关键字,比如检测union,用%55也就是U的16进制编码来代替U, union写成%55nION,结合大小写也可以绕过一些WAF

    ■ 注释绕过

    适用于WAF只是过滤了一次危险的语句,而没有阻断我们的整个查询

    /?id=1+union+select+1,2,3/*

    比如对于.上面这条查询,WAF过滤了一次union和select,在之前在写一个注释的语句,让他把注释里面的过滤掉,,并不影响我们的查询。绕过语句就是:

    /?id=1/*union*/ union /*select*/ select+1,2,3/*

    ■ 分隔重写绕过

    适用于那种WAF采用了正则表达式的情况,会检测所有的敏感字

    /?id=1+un/**/ion+sel/**/ect+1,2,3-

    至于重写绕过,适用于WAF过滤了一次的情况,和上传aaspsp马的原理一样,我们可以写出类似Ununionion这样的。过滤一次union后就会执行我们的查询了

    ?id=1 ununionion select 1,2,3-

    ■ 同功能函数替换

    Substring()可以用mid(),substr()这些函数来替换,都是用来取字符串的某一位字符的。

    Ascii()编码可以用hex(),bin(),也就是16进制和二进制编码替换

    时间盲注中Benchmark()可以用sleep()来替换

    SQLMap中有一个tamper目录,主要存放的是waf绕过脚本,比如: base64encode.py、between.py、greatest.py等。

    等号被过滤了--->qualolkeoo--->like代替等号

    Example:

    * Input: SELECT * FROM users WHERE id=1

    *Output: SELECT * FROM users WHERE id LIKE 1

    替换字符和单引号被过滤---apostrophenullencode.py]()

    Example:

    ("1 AND '1'='1")

    "1 AND %00%27 1%00%27=%00%271"
  11. SQL注入的防护策略:

    ■ 使用参数化查询, 检查变量数据类型和格式

    SQL注入因为要操作数据库,所以一般会查找SQL语句关键字:insert、 delete、update、select, 查看传递的变量参数是否用户可控制,有无做过安全处理

    ■ 采用sql语句预编译和绑定变量
    String 3ql = "select id, no from user where id=?"; PreparedStatement p3 = conn. prepareStatement(3q1) ; p3.setInt(1, id) ; p3. executeQuery() ;
    采用了PreparedStatement,将sql语句: “select id, no from user where id=?"预先编译好,即SQL引擎会预先进行语法分析,产生语法树,生成执行计划;这样后面无论输入什么参数,都不会影响该sql语句的语法结构了。

    ■ 不要随意开 启生产环境中Webserver的错误显示

    ■ 做好数据库帐号权限管理

    ■ 严格加密处理用户的机密信息

    ■ 使用WAF等专业的防护软件系统

六. 文件解析&文件上传

一. 文件解析:

  1. web容器:

    web容器是一种服务程序,在服务器一个端口就有一个提供相应务的程序,而这个程序就是处理从客户端发出的请求,如JAVA 中的Tomcat容器,ASP的IIS都是这样的容器。一个服务器可以有多个容器。我们在常见web容器漏洞这部分学习中需要使用的容器如下:IIS、Apache、Nginx、 Tomcat、Jboss、 WebLogic。
  2. IIS6.0文件解析漏洞:

    IIS的全称是互联网信息服务(Internet Information Services),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。IIS包括FTP/FTPS、NNTP、和HTTPS / HTTP、SMTP等服务。

    相关词条解释:

    ■ .net Framework是基础类库,是程序运行的底层框架

    ■ ASP.Net是.net里用来做网站的技术集合

    ■ IIS是架设Web服务器用来提供网页浏览服务的,属于系统环境。

    ■ 一般用ASP.Net开发软件,然后靠IIS对公网提供服务,软件的底层是.netFramework

    实际的漏洞环境中IIS一般是和asp搭配的,上传的地方如果限制了.asp的后缀名,那么首先想到的应该是使用其它IIS支持的文件后缀。其实IIS解析asp脚本除了.asp后缀还有.cer和.asa

    ■ 漏洞利用:

    IIS 6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:

    /test.asp/test.jpg

    test.asp;jpg

    第一种 是新建一个名为"test.asp"的目录,该目录中的任何文件都被IIS当做asp程序执行(特殊符号是"/")



    第二种 是上传名为"test.asp;jpg" 的文件,虽然该文件真正的后缀名是".jpg", 但由于含有特殊符号";", 仍会被IIS当做asp程序执行。

  3. Apache文件解析漏洞(与用户配置有关):

    ■ Apache和php三种结合方法:

    CGI: 通常翻译为共同网关接口,是HTTP服务器与机器上的其他程序进行通信的一个接口,让Web服务器必要时启动额外的程序处理动态内容。

    FastCGI: CGI解释器的更快实现,可以提供良好的性能、伸缩性、Fail-Over特性等等。

    Module: 把php编译为apache的模块,也是用的最多的一种方法。

    ■ 举例:发生在Module结合方法上的Apache文件解析漏洞(配置apt-get install libapache2-mod-php7.0)

    ■ 查看Apache和php的结合方式:



    ■ 一个重要文件/etc/ mime.types:



    这里记录了大量的文件后缀和mime类型,当客户端请求一一个文件时,如果后缀在这个列表里,那么apache就返回对应的content-type给浏览器如果不在列表,apache不会返回content-type给浏览器,而直接文件内容,由浏览器自动处理。



    这里关于php的全部都被注释掉了。



    如果请求的文件名匹配正则:.+\.ph(ar|p|tml)$

    也就是说(php | phar | phtml)是文件的最后一个后缀,则把文件交给php处理器(php_ module)来处理处理完之后结果返回给apache,再由apache发送给浏览器。

    ■ 漏洞原理:

    解析漏洞的产生是由于运维人员在配置服务器时,为了使apache服务器能解析php,而自己添加一个handler,例如:



    它的作用也是为了让apache把php文件交给php_module解析,但是注意到它与SetHandler:它的后缀不是用正则去匹配的。所以,在文件名的任何位置匹配到php后缀,它都会让php_module解析。

    Apache文件解析漏洞涉及到一个解析文件的特性:

    Apache默认一个文件可以有多个以点分隔的后缀,当右边的后缀无法识别(不在mime.types内),则继续向左识别。

    当我们请求这样一个文件:shell.php.xxx.yyy

    yyy ->无法识别,向左

    xxx ->无法识别,向左

    php ->发现后缀是php,交给php处理这个文件

    如下图创建1.php.aaa这个文件:



    再访问1.php.aaa发现成功解析:



    ■ 修复方法:

    不要使用AddHandler,改用SetHandler,写好正则,就不会有解析问题,

    <FilesMatch ".+\.php$">

    SetHandler application/x-httpd-php

    </FilesMatch>

    禁止.php.这样的文件执行,

    <FilesMatch ".+.ph(p[3457]?|t|tml).">

    Require all denied

    </FilesMatch>
  4. Nginx文件解析漏洞:

    配置方法:

    找到/etc/nginx/sites-available/default:




    将注释去掉:



    ■ 漏洞利用:

    1、对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。

    2、对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。

    ■ 漏洞原理:

    在/etc/php5/fpm/php.ini中
    cgi.fix.pathinfo,该值默认为1,表示开启。

    用途:对文件路径进行"修理"

    当php遇到文件路径"/aaa.xxx/bbb.yyy/ccc.zzz"时,若"/aaaxxx/bbb.yyy/ccc.zzz"不存在,则会去掉最后的"/ccc.zzz",然后判断"/aaa.xxx/bbb.yyy" 是否存在,若存在,则把"/aaa.xxx/bbb.yyy"当做文件"/aaa.xxx/bbb.yyy/ccc.zzz",若"/aaa.xxx/bbb.yyy"仍不存在,则继续去掉"/bbb.yyy",以此类推。

    配置 /etc/php5/fpm/pool.d/www.conf 中 security.limit _extensions 允许解析其他格式文件为PHP



    ■ 修复方法:

    1、将 php.ini 文件中的 cgi.fix_pathinfo 的值设为 0。这样php在解析 1.jpg/1.php 这样的目录时,只要 1.php 不存在就会显示 404。

    2、将 /etc/php5/fpm/pool.d/www.conf 中 security.limit_ext`ensions 后面的值设为 .php等。

二. 文件上传漏洞:

  1. 前端检测:

    ■ 检测原理:

    调用 JS 的 selectFlle() 函数,先将文件名转换为小写,然后通过 substr 获取文件名最后一个点号后面的后缀(包括点号)进行判断。



    ■ 绕过方法:后端没有对文件做任何检测,所以只需要抓包修改文件后缀名就可以上传webshell。
  2. 文件后缀检测:

    ■ 检测原理:

    通过函数 pathinfo() 获取文件后缀,将后缀转为小写后判断是不是php。



    ■ 绕过方法:

    1.有些中间件允许解析其他后缀的,如在 httpd.conf 配置文件中,配置能解析 php、php3、phtml 文件。

    2.利用文件解析漏洞。
  3. MIME类型检测:

    ■ 检测原理:

    判断 $_ FILES["file"]["type"] 是不 是图片格式 (image/gif、image/ipeg、image/pjpeg) ,不是则不允许上传。

    $_ FILES["file"]["type"] 的值是从请求数据包中Content-Type中获取



    ■ 绕过方法:

    通过抓取数据请求包,上传php文件时,Content-Type 值是 application/octer-stream,上传 jpg 格式的文件时 Content-Type 值是 image/ipeg。可修改文件类型进行绕过。
  4. 文件幻数检测:

    ■ 检测原理:

    利用 getimagesize() 函数获取图片的宽高等信息。



    ■ 绕过方法:

    在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码。

  5. 文件截断绕过:

    ■ 检测原理:

    由于 00 代表结束符,PHP 会把 00 后面的所有字符删除。

    截断条件:PHP 版本小于 5.3.4、magic_quotes_gpc 为 0FF 状态。


    ■ 绕过方法:

    GET方法中加入00截断

    POST方法中传入%00并解码
  6. 条件竞争攻击:

    ■ 检测原理:

    一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容
    是否包含可执行脚本,如果包含则删除。这里使用sleep0函数来模拟判断是否含有脚本所需要的时间。



    ■ 绕过方法:

    利用成功上传到删除文件的时间差,上传一个 .php 文件,在未删除之前立即访问,则会自动生成一个新 php 文件,新文件不会被删除。

七. 文件包含

  1. 概念:

    把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,无需再次编写函数。这一过程被称为包含。
  2. 文件包含函数:

    include():找不到被包含文件时会产生警告 (E WARNING) ;

    include_once():与 include() 类似,代码已经被包含则不会再次包含;

    require():找不到被包含的文件时会产生致命错误 (E_COMPILE_ ERROR) ;

    require_once():与 require() 类似,代码已经被包含则不会再次包含。
  3. 示例:

    ■ 示例1:



    ■ 示例2:



    分别修改phpinfo.txt扩展名为: ipg、 rar、 lola发现均可解析,只要文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。

    ■ 远程文件包含:



  4. 文件包含利用:

    ■ 文件包含漏洞

    ■ 读取敏感文件:

    例:http://localhost/index.php?page=C:windows-version.txt

    ——Windows 系统敏感信息:

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

    IIS配置文件:C:\windows\system32\inetsrv\MetaBase.xml

    windows初次密码:C:\windows\repair\sam

    Mysql配置:C:\program Files\mysql\my.ini

    Mysql root:C:\program Files\mysqI\data\mysql\user.MYD

    php配置信息:C:\windows\php.ini

    ——Linux系统敏感信息:

    linux用户信息:/etc/passwd

    apache2配置文件:/usr/local/app/apache2/conf/httpd.conf

    php设置:/usr/local/app/ php5/lib/php.ini

    apache配置文件:/etc/httpd/conf/httpd.conf

    Myysql配置文件:/etc/my.cnf

    ■ 远程包含shell:

    allow_url_fopen 开启

    访问:http://localhost/index.php?page=http://localhost/1.txt

    2019年学习整理总结——Lola39

    会在 index.php 目录下生成 shell.php

    ■ 本地包含配合文件上传

    ■ 使用PHP封装伪协议

    PHP内置有很多内置URL风格的封装协议,可用于 fopen()、copy()、file_exists() 和 filesize() 的文件系统函数。

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

    ——http://
    访问HTTP(s)网址

    ——ftp://
    访问FTP(s) URLs

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

    ——zlib://
    压缩流

    http://127.0.0.1/cmd.php?file=zip://D:/soft/ phpStudy/wWW/file.jpg%23phpcode.txt

    先将要执行的PHP代码写好文件名为 phpcode.txt ,将 phpcode.txt 进行zip压缩,压缩文件名为 file.zip ,如果可以上传zip文件便直接上传,若不能便将 file.zip 重命名为 file.jpg 后再上传,其他几种压缩格式也可以这样操作。

    ——data://
    数据(RFC 2397):

    命令执行:
    http://127.0.0.1/cmd.php?file=data://text/ plain,

    http://127.0.0.1/cmd.php?file=data://text/ plain;base64,PD9waHAgcGhwaW5mbygpPz4=

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

    ——phar:// PHP归档

    ——ssh2:// Secure Shell 2

    ——rar:// RAR

    ——ogg:// 音频流

    ——expect:// 处理交互式的流
  5. 包含apache日志文件:

    找到Apache路径,利用保护漏洞包含日志文件获取Webshell。

    Apache两个日志文件: access.log、error.log

    当访问不存在的资源时,apache日志同样会记录,访问: 127.0.0.1/include/,再包含access,log
  6. 截断(%00)包含:

    2019年学习整理总结——Lola39

八. 命令远程执行

  1. 原理:

    程序应用有时需要调用一些执行系统命令的函数,如PHP中的system、 exec、shell_exec、passthru、popen、 proc _popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

    ■ 两个条件:(1)用户能够控制的函数输入;(2)存在可以执行代码的危险函数。

    ■ 命令执行漏洞产生的原因:

    1、由于开发人员编写源码时,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句,并提交服务端执行;

    2、命令注入攻击中,Web服务器没有过滤类似system、eval和exec等函数, 是该漏洞攻击成功的主要原因。
  2. 命令执行漏洞带来的危害:

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

    ➢反弹shell

    ➢控制整个网站甚至控制服务器

    ➢进一步内网渗透
  3. 示例:

    1、通过提交一个cmd命令来使其执行:



    即可通过 *?a=whoami 查看权限

    2、动态函数调用:





    访问:*?fun=system&par=net user显示出当前用户信息

    3、危险函数导致代码执行:





    ■ PHP的一些可调用外部程序的常见函数:

    ——system:
    string system (string $command [, int &$return _var])

    成功则返回命令输出的最后一行,失败则返回FALSE。

    ——exec:
    string exec (string $command [, array &$output [, int &$return_var]] )

    命令执行结果的最后一行内容。

    ——shell_exec:
    string shell_exec (string $cmd)

    命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。

    ——passthru:
    void passthru (string $command [, int &$return_var])

    执行外部程序并且显示原始输出。

    ■ 命令执行相关函数:

    eval()、assert()、preg_replace()、call_user_func()
  4. 常见场景:

    Ping主机、DNS请求、0ffice文档、框架缺陷
  5. 防御:

    (1)、尽量不要执行外部命令

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

    (3)、使用 escapeshellarg 函数来处理命令参数

    (4)、使用 safe_mode_exec_dir 指定可执行文件的路径(php. ini)

    用 safe_mode_exec_dir 指定可执行文件的路径,可以把会使用的命令提前放入此路径内
    safe_mode_exec_dir = /usr/local/php/bin/

九. 脚本、字典的编写、收集、更新

一、自动化-->重复性工作使用脚本完成

二、保留历史数据-->越来越强力的字典:

  1. 目录扫描字典(dirsearch);
  2. 爆破字典(PB):API中的参数、JS文件中的参数、从其他人的漏洞报告中
  3. XSS Payloads字典;


本网站博主