我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
文章目录
一、熊海CMS_v1.0网站目录结构
admin --后台文件夹
css --css文件夹
files --存放网站的各种功能页面文件夹
images --存放图片文件夹
inc --配置文件文件夹
install --网站安装文件夹
seacmseditor --网站的编辑器文件夹
template --模板文件夹
upload --上传文件夹,存放网站上传的文件
index.php --网站入口文件
二、Seay代码审计系统漏洞报告
审计结果:发现可疑漏洞总数:34个
ID | 漏洞描述 | 文件路径 | 漏洞详细 |
---|---|---|---|
1 | 文件包含函数中存在变量,可能存在文件包含漏洞 | /index.php | include(‘files/’.$action.‘.php’); //载入相应文件 |
2 | 文件包含函数中存在变量,可能存在文件包含漏洞 | /admin/index.php | include(‘files/’.$action.‘.php’); //载入相应文件 |
3 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/adset.php |
q u e = ” U P D A T E w S E T 1 = ′ query = “UPDATE adword SET ad1=’ query=“UPDATEadwordSETad1=′ad1’, |
4 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/editcolumn.php |
q u e r = ” U P D A T E n l a S E T n a e = ′ query = “UPDATE navclass SET name=’ query=“UPDATEnavclassSETname=′name’, |
5 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/editcolumn.php |
q u e r = ” U P D A T E n a v S E T n a e = ′ query = “UPDATE nav SET name=’ query=“UPDATEnavSETname=′name’, |
6 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/editlink.php |
q u e r y = ” U P D A T E l i n S E T n a e = ′ query = “UPDATE link SET name=’ query=“UPDATElinkSETname=′name’, |
7 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/editsoft.php |
q u e r y = ” U P D A T E w n l a S E T i l e = ′ query = “UPDATE download SET title=’ query=“UPDATEdownloadSETtitle=′title’, |
8 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/editwz.php |
q u e r y = ” U P D A T E n e n S E T n a v l a s s = ′ query = “UPDATE content SET navclass=’ query=“UPDATEcontentSETnavclass=′navclass’, |
9 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/imageset.php |
q u e r y = ” U P D A T E i a e s e t S E T i m k = ′ query = “UPDATE imageset SET img_kg=’ query=“UPDATEimagesetSETimgkg=′img_kg’, |
10 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/manageinfo.php |
q u e r y = ” U P D A T E m a n a e S E T u s e r = ′ query = “UPDATE manage SET user=’ query=“UPDATEmanageSETuser=′user’, |
11 | SQL语句insert中插入变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/newlink.php |
q u e r y = ” I N S E R T I N T O l i n k ( n a m e , u r l , m a i l , j i e s h a , x s , d a t e ) V A L U E S ( ′ query = “INSERT INTO link (name,url,mail,jieshao,xs,date) VALUES (‘ query=“INSERTINTOlink(name,url,mail,jieshao,xs,date)VALUES(′name’,‘ u r l ′ , ′ url‘,’ url′,′mail’,‘jieshao’,‘xs’,now())”; |
12 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/reply.php |
q u e r y = ” U P D A T E i n t e r a t i o n S E T x s = ′ query = “UPDATE interaction SET xs=’ query=“UPDATEinteractionSETxs=′xs’, |
13 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/seniorset.php |
q u e r y = ” U P D A T E s e n i o r s e t S E T l y s h = ′ query = “UPDATE seniorset SET lysh=’ query=“UPDATEseniorsetSETlysh=′lysh’, |
14 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /admin/files/siteset.php |
q u e r y = ” U P D A T E s e t t i n g s S E T n a m e = ′ query = “UPDATE settings SET name=’ query=“UPDATEsettingsSETname=′name’, |
15 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /files/content.php |
q u e r y = ” U P D A T E c o n t e n t S E T h i t = h i t + 1 W H E R E i d = query = “UPDATE content SET hit = hit+1 WHERE id= query=“UPDATEcontentSEThit=hit+1WHEREid=id“; |
16 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /files/downloads.php | print (fread($fp, 1024 * 8)); //输出文件 |
17 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /files/downloads.php |
f p = f o p e n ( ” fp=fopen(“sourceFile”, “rb”); |
18 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /files/downloads.php |
q u e r y = ” U P D A T E d o w n l o a d S E T x i a z a i = x i a z a i + 1 W h E R E i d = ′ query = “UPDATE download SET xiazai = xiazai+1 WhERE id=’ query=“UPDATEdownloadSETxiazai=xiazai+1WhEREid=′fileid’”; |
19 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /files/software.php |
q u e r y = ” U P D A T E d o w n l o a d S E T h i t = h i t + 1 W H E R E i d = query = “UPDATE download SET hit = hit+1 WHERE id= query=“UPDATEdownloadSEThit=hit+1WHEREid=id”; |
20 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /inc/db.class.php | $line = fgets ( $f ); |
21 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /inc/db.class.php | $f = fopen ( $sqlfile, “rb” ); |
22 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /inc/db.class.php | if (! @$fp = fopen ( $dir . $filename, “w+” )) { |
23 | 文件操作函数中存在变量,可能存在任意文件读取/删除/修改/写入等漏洞 | /inc/db.class.php | if (! @fwrite ( $fp, $sql )) { |
24 | SQL语句insert中插入变量无单引号保护,可能存在SQL注入漏洞 | /inc/db.class.php | $insert .= “INSERT INTO " . $table . " VALUES(”; |
25 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /inc/mail.class.php | if (!@file_exists(
t h i s − > l o g f i l e ) ∣ ∣ ! ( this−>logfile)∣∣!(fp = @fopen($this->log_file, “a”))) { |
26 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /inc/mail.class.php | fgets($this->sock, 512); |
27 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /inc/mail.class.php | KaTeX parse error: Can’t use function ‘r’ in math mode at position 25: …= str_replace(“̲r̲n”, “”, fgets(this->sock, 512)); |
28 | 存在文件上传,注意上传类型是否可控 | /inc/up.class.php | if ( move_uploaded_file( $this -> uploadFile[ ‘tmp_name’ ] , realpath( $this -> accessPath ) . “/” . $newFileName ) ) |
29 | 文件操作函数中存在变量,可能存在任意文件读取/删除/修改/写入等漏洞 | /install/index.php | fwrite(
o f , of, of,content); |
30 | SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 | /install/index.php |
q u e r y = ” U P D A T E m a n a g e S E T u s e r = ′ query = “UPDATE manage SET user=’ query=“UPDATEmanageSETuser=′user’,password=‘ p a s s w o r d ′ , n a m e = ′ password‘,name=’ password′,name=′user’”; |
31 | echo等输出中存在可控变量,可能存在XSS漏洞 | /seacmseditor/php/controller.php | echo htmlspecialchars($_GET[“callback”]) . ‘(’ . $result . ‘)’; |
32 | 读取文件函数中存在变量,可能存在任意文件读取漏洞 | /seacmseditor/php/Uploader.class.php | readfile($imgUrl, false, $context); |
33 | 文件操作函数中存在变量,可能存在任意文件读取/删除/修改/写入等漏洞 | /seacmseditor/php/Uploader.class.php | if (!(file_put_contents($this->filePath, KaTeX parse error: Expected ‘EOF’, got ‘&’ at position 6: img) &̲& file_exists(this->filePath))) { //移动失败 |
34 | 存在文件上传,注意上传类型是否可控 | /seacmseditor/php/Uploader.class.php | if (!(move_uploaded_file($file[“tmp_name”], KaTeX parse error: Expected ‘EOF’, got ‘&’ at position 17: …his->filePath) &̲& file_exists(this->filePath))) { //移动失败 |
三、漏洞1&2分析:
ID | 漏洞描述 | 文件路径 | 漏洞详细 |
---|---|---|---|
1 | 文件包含函数中存在变量,可能存在文件包含漏洞 | /index.php | include(‘files/’.$action.‘.php’); //载入相应文件 |
2 | 文件包含函数中存在变量,可能存在文件包含漏洞 | /admin/index.php | include(‘files/’.$action.‘.php’); //载入相应文件 |
1、/index.php&/admin/index.php
如下所示,是我们的index.php页面和admin目录下的index.php页面源码:
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
2、单一入口模式
第一行的注释里面有写”单一入口模式“,这个是什么意思呢?简单来说就是**用一个文件处理所有的HTTP请求
**,例如不管是内容列表页,用户登录页还是内容详细页,都是通过从浏览器访问 index.php 文件来进行处理的,这里这个 index.php 文件就是这个应用程序的单一入口(具体造成的影响在我们后面使用文件时会再次提到来进行理解)。
3、error_reporting(0)
error_reporting(0); 表示关闭所有PHP错误报告。
4、string addslashes ( string $str )
本函数可在PHP4和PHP5下使用。
本函数返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)。
默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
5、三元运算符、拼接字符串
通过三元运算符判断文件名是否为空,为空则载入files/index.php文件,反之赋值就会把传递进来的文件名赋值给a c t i o n , ” . “ 在 P H P 里 是 拼 接 的 作 用 , 因 此 就 是 把 第 四 行 传 递 的 变 量 action,“.“在PHP里是拼接的作用,因此就是把第四行传递的变量action,”.“在PHP里是拼接的作用,因此就是把第四行传递的变量file(到这里是a c t i o n , 因 为 上 一 行 action,因为上一行action,因为上一行file赋值给了$action)也就是传递的文件名字,拼接前面的目录”files/”以及后面的”.php”这个后缀,最终载入拼接后的相应文件。
6、那么这里漏洞利用其实就两个问题:
2.截断拼接的.php后缀。【结合Windows文件名字的特性
及Windows文件名的全路径最大长度限制
进行截断】
7、特性+全路径最大长度限制截断的姿势:
Windows下在文件名字后面加 “.” 和“/”不影响文件名。
Windows的文件名的全路径(Fully Qualified File Name)的最大长度为256字节。
>>> print('.'*256);
................................................................................................................................................................................................................................................................
>>> print('./'*128);
././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
使用条件:
1.php版本=5.2.17
2.Virtual Directory Support=enable(默认开启)
但是5.2.67是默认关闭的!!!
如何开启呢?并没有给出明确的说明!!
点击跳转到Virtual Directory Suuport在stackoverflow上的说明
payload1:
http://www.xhcms.com/?r=../test.txt................................................................................................................................................................................................................................................................
payload2:
http://www.xhcms.com/?r=../test.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
8、00截断拼接后缀原理:[在服务器端解析时]
00截断的条件:
1、php版本小于5.3.4 //在PHP5.3之后的版本全面修复了文件名%00截断的问题
2、magic_quotes_gpc =off //gpc打开的时候,就相当于使用了addslashes()函数
3、未使用addslashes()函数 //使用了addslashes()函数,就相当于打开了gpc
浏览器传入%00,后台会自动解码为,若遇到addslashes()函数,则会被自动转义为\。
00截断的原理:由于php借用了C语言的字符串处理函数,%00在URL解码后为,是C语言中字符串结束符
,遇到不能再读取后面的字符串
PHP是一种跨平台的服务器端的嵌入式脚本语言,它大量地借用C,Java和Perl语言的语法,并耦合PHP自己的特性,这个%00便是使用了C语言中的字符串处理函数,在连接字符串的时候,0字节()将作为字符串结束符,%00在URL解码后为,是C语言中字符串结束符,遇到不能再读取后面的字符串。因此以它来进行截断。
在C语言里面,字符时用,指针是用NULL,0x00很少见,一般直接用0代替;这三个本身是一个东西。
%00就是一个返回符号,类似于C中的"/0"和对象语言中的NULL,也是WINDOWS 中的空格
url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“”,它的ascii码是92,92的十六进制是5c,所以“”的url编码就是%5c。
又比如:NULL字符的十进制为0,0的十六进制也为0,因此再加上%,NULL字符的URL编码就成为了%00。
在C语言中,NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值。对于字符串的结尾,使用'',它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值。
因此%00是NULL字符的url编码,在C语言中NULL也是0的意思,也是字符串结束符的意思。
ASCII码表:
9、?和#截断拼接后缀原理:[在浏览器请求时]
?和#截断的本质是:
因为?和#后面的内容都不进行解析的条件是:这只能算是url的一个特性,只能在发起请求的一端来截断,和服务端的解析没什么关系。因此不会成功解析。
?截断原理:问号后面的所有代码被解释成URL的querystring请求字符串,也是一种“截断”。
#截断原理:在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端,也是一种“截断”。
#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如:http://www.example.com/index.html#print,其中#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。
为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name="print"></a>;二是使用id属性,比如<div id="print">。
10、总结:三种截断的含义
%00(是字符NULL,也是C中的'/0',或者是windows中空格) 字符串结束符 (服务器处理)
? 请求字符串标识符 (浏览器处理)
# 跳转位置标识符 (浏览器处理)
11、Apache日志文件包含
(1)通过apache配置文件,找到日志存放地址:find / -name "httpd.conf"
/var/log/apache2/access.log
/var/log/apache2/access.log
CentOS, Fedora, RedHat的日志默认存放位置:
/var/log/httpd/access.log
/var/log/httpd/access.log
phpstudy的日志默认存放位置:新安装的phpstudy默认apache访问日志是没有开启的,默认开启的只有一个错误日志
c:phpstudyphptutorialapachelogsaccess.log
c:phpstudyphptutorialnginxlogsaccess.log
(2)日志文件位置如何设置:
错误日志的位置可以通过ErrorLog指令设置:ErrorLog "logs/error.log"
正确日志的位置可以通过CustomLog指令设置:CustomLog "logs/access.log" common
(3)日志文件的字段分析:
这里我们要知道的是,apache和nignx的access.log访问日志对http请求的记录机制。无论访问的资源存在与否,它每次都会一行记录一次http请
求。
正确日志:7个字段,从左到右依次是【访问者IP、访问者标识、访问者账号信息、时间时区、请求资源(GET请求时,记录的是请求行)、状态码、字节数】
access.log 216.35.116.91 - - [19/Aug/2000:14:47:37 -0400] "GET / HTTP/1.0" 200 654
错误日志:4个字段,从左到右依次是【访问时间、错误级别、访问者IP、请求资源】
[Fri Aug 18 22:36:26 2000] [error] [client 192.168.1.6] File does not exist:/usr/local/apache/bugletdocs/Img/south-korea.gif
(4)access.log如何记录GET请求的资源:
access.log日志在记录的GET请求内容的时候,它是在浏览器页面渲染(编码)后才发送给服务器端的,之后再被记录到日志里面。所以此时若遇到空格、
尖括号等等字符,它会先被url编码后,再被记录到日志里面。
若<>等等字符被URL编码,则文件包含后,该代码不能被php成功的解析,所以我们要使用Burpsuite拦截下浏览器的渲染后的请求,我们对GET
请求进行URL解码后,再放通。
(5)文件包含三步走:
1.使用哪个文件包含函数?(主语是后台)
2.以什么形式获取待包含的文件?(主语是后台)
2.对变量是否可控?(主语是前台)(假如以动态变量引入的形式获取待包含文件)
(6)access.log日志文件包含
当前网站首页位置:L:PHPphpStudyPHPTutorialWWWcmswww.xhcms.comindex.php
access.log日志文件位置:L:PHPphpStudyPHPTutorialApachelogs
又由于要跳出限定目录’file/’,因此需要使用…/4次目录穿越。
payload1:
http://www.xhcms.com/?r=../../../../apache/logs/access.log................................................................................................................................................................................................................................................................
payload2:
http://www.xhcms.com/?r=../../../../apache/logs/access.log././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
原文地址:https://blog.csdn.net/qq_45555226/article/details/125755289
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_30194.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!