审计入门之路(三):Hadsky

这次是一个轻论坛,下载的源码合计1M。数据库一共才8个表,过滤挺暴力的,但还是找到一处后台的注入。

/app/superadmin/phpscript/moveread.php 11行

1
2
3
4
5
6
7
if ($_G['GET']['TABLE'] == 'read' && $sortid && count($ids)) {
foreach ($ids as $id) {
if ($id)
mysql_query("update `{$_G['MYSQL']['PREFIX']}read` set `sortid`={$sortid} where `id`={$id}");
}
$r = '操作成功!';
}

$id被带入数据库中,向上追$id

1
$ids = (array)$_POST['ids'];

所以就直接注入了。

除了注入,还有一处没有利用成功的XSS,也写进来把。

/puyuetian/function.php 258行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function getClientInfos($info = 'all') {
if ($info == 'all') {
$infos = '浏览器标示:' . $_SERVER['HTTP_USER_AGENT'] . ' <br>
';
$infos .= '客户端语言:' . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '
<br>
';
$infos .= '客户端IP地址:' . $_SERVER['REMOTE_ADDR'];
} elseif ($info == 'ip') {
$IPaddress = '';
if (isset($_SERVER)) {
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$IPaddress = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
$IPaddress = $_SERVER["HTTP_CLIENT_IP"];
} else {
$IPaddress = $_SERVER["REMOTE_ADDR"];
}
} else {
if (getenv("HTTP_X_FORWARDED_FOR")) {
$IPaddress = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("HTTP_CLIENT_IP")) {
$IPaddress = getenv("HTTP_CLIENT_IP");
} else {
$IPaddress = getenv("REMOTE_ADDR");
}
}
$infos = $IPaddress;
} else {
$infos = $_SERVER[$info];
}
return $infos;
}

没有做ip的限制。把ip存入数据库的时候有过滤,所以不能注入,但是他把ip直接输出在每个网页的最下面了。但我不知道怎么用伪造ip头做XSS。有会的师傅请指点一哈^_^

最近看Seay师傅写的代码审计书,跟吸大麻似的两天就看完了。学习很多干货,看代码的时候也更有针对性了。同时也意识到了这几次找的注入都是很基础的漏洞。我在找的是之后也发现,如果入口过滤完善,程序员写代码按照规范,也就基本不会出现注入一类的漏洞了。(二次注入不算)所以这几次找的注入都是程序员写代码时没使用db类,使用query()直接查询出了问题。

支持一下
扫一扫,支持forsigner