[网鼎杯 2018]Comment

考点:二次注入、git源码泄露、git源码还原、密码爆破、网页控制台提示、Linux中某些文件的作用

参考:git源码还原 (其原理可参考柠檬师傅的文章:传送门)
[网鼎杯 2018]Comment ----solved by s1mple

知识点:
git源码还原:
这里需要用到王一航大佬的GitHacker-master工具,使用工具解析源码,然后进入下载下来的目录,输入git log --reflog

再输入 git reset --hard commit号 即可恢复源码

关于二次注入:
因为本题涉及到了sql语句的构造,所以我注意到了这点,在经addsashes()等过滤函数处理后的数据,在写入到数据库的时候反斜杠会被移除,所以写入到数据库的内容就是原始数据,并不会在前面多了反斜杠,这也正是会产生二次注入的主要原因(怪自己以前没有理清二次注入产生的代码原理)

.DS_Store文件和.bash_history文件:
.DS_Store文件会记录文件夹中文件信息,如文件名等
.bash_history文件会记录用户的bash命令操作记录

一些sql函数:
hex():将结果以hex编码进行输出
load_file():参数为文件物理路径,输出文件内容(很多时候输出内容不全,所以最好配合如hex()这样的编码函数使用)

解题:
打开题目一个登录框,简单测试一下为发现sql注入,然后根据提示,爆破出来了密码zhangwei666,登录进去就有一个发表评论的地方,根据题意来理解,这种有评论的题只有两种可能,XSS和二次注入,而这道题并没有bot,那就是二次注入了
扫描文件发现了git源码泄露,但是使用GitHack工具下载下来后源码感觉非常残缺,而此时找到index.php的网页控制台的提示

没来得及commit,那就是git源码残缺了,可使用王一航大佬的工具进行恢复

write_do.php源码如下:

代码逻辑:
首先会判断用户是否登录,然后系统将用户发表的评论经addslashes()处理后存入数据库
在comment模块里,第28行将取出的数据赋值给$category,然后第31行直接拼接到sql语句,中间没有任何过滤,因此可造成二次注入
这里有一点需要注意,在30~33行的sql语句是多行的语句,所以使用#这种单行注释不行,需要使用/*这种多行注释

接下来就是思考怎么构造语句的问题了,很显然,在最后的sql语句中,拼接的三个参数我们都可调用,其中$content和$bo_id在拼接到语句之前是经过了addslashes()处理的,所以不能将单引号放在这两个参数,那就只有第一个参数,也就是$category了,那么可以这样构造

在$category传入:1',content=(select database()),/*
在$bo_id传入:*/#

所以到最后后台会执行:
set category = '1',content=(select database()),/*'
content = '$content',
bo_id = '*/#';

即中间的content字段会被覆盖

点击发帖,在category输入payload

点击详情,在留言那里输入*/#

数据库名为ctf,接下来在content字段构造自定义的语句即可

有意思的是最后的flag并不在数据库里,需要找到合适的函数,利用sqli去找历史文件记录,然后找到flag文件名字才能进行读取

payload:1',content=(select( load_file('/etc/passwd'))),/* 利用/etc/passwd找到用户所在目录

payload:
1',content=(select(load_file('/home/www/.bash_history'))),/*
查看history文件,bash命令的操作历史记录就储存在该文件

步骤:
系统将在/tmp目录解压html.zip后删除了压缩包,复制到了/var/www目录,然后切换到/var/www/html/目录删除了.DS_Store文件,最后开启apache服务
可知在/tmp/html/目录其实是还有.DS_Store文件的
.DS_Store文件记录了文件夹中文件的信息,于是我们可以尝试读取它(注意.DS_Store文件需要使用其他编码获取,直接读取文件不能显示全部内容)

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

解码可看到一个flag_8946e1ff1ee3e40f.php

最后payload:
1', content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*

此条目发表在sql注入, 刷题记录分类目录。将固定链接加入收藏夹。

[网鼎杯 2018]Comment》有1条回应

  1. admin说:

    恢复git源码的命令那里不知道为什么显示出来只有一个 – 符号,其实是有两个-符号的,

发表评论

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