直接上代码

<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
    $category = addslashes($_POST['category']);
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);
    header("Location: ./index.php");
    break;
case 'comment':
    $bo_id = addslashes($_POST['bo_id']);
    $sql = "select category from board where id='$bo_id'";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    if($num>0){
    $category = mysql_fetch_array($result)['category'];
    $content = addslashes($_POST['content']);
    $sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);
    }
    header("Location: ./comment.php?id=$bo_id");
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

addslashes会把',",\和%00转义,但是转义的符号\在插入时候是不会带入数据库内的
而在把category取出的时候没有进行任何过滤,所以可以构造payload进行二次注入
由于语句是换行的,没办法一次性全都注释 在comment里拼接一个注释
', content=database(),/
/#
加一个逗号是因为后面的语句content在第二行,注释之后会缺一个
然后注了半天没注出来flag
看了眼wp是用select load_file读文件 Orz 太骚了
主要的还是在插入语句时 如果使用addslashes进行转义,不会把\代入数据库 如果取出的时候再不做正确处理,就会导致注入 也可以看到上面在取出时就没对category进行处理 才导致了二次注入

分类: 技术

0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注