“百度杯”CTF比赛 十月场 Vld
程序员文章站
2024-03-19 23:02:10
...
知识点
- Vulcan Logic Dumper
- 代码审计
- SQL注入
WP
首先进入环境,查看源码发现index.php.txt,进入后发现是我看不懂的东西。。可以上网查Vulcan Logic Dumper,还弄懂怎么从这些东西来还原php代码,还原的代码如下:
1 <?php
2
3 echo ‘do you know Vulcan Logic Dumper?<br>‘;
4 $a=$_GET[‘flag1‘];
5 $b=$_GET[‘flag2‘];
6 $c=$_GET[‘flag3‘];
7
8 if($a!=‘fvhjjihfcv‘)
9 {
10 echo ‘false<br>‘;
11 }
12 elseif($b!=‘gfuyiyhioyf‘)
13 {
14 echo ‘false<br>‘;
15 }
16 elseif($c!=‘yugoiiyhi‘)
17 {
18 echo ‘false<br>‘;
19 }
20 else
21 {
22 echo ‘the next step is xxx.zip‘;
23 }
24
25
26 echo ‘<!-- index.php.txt ?>‘;
?>
或者直接猜。。。大致看一下,发现了get,大致能看出来flag1,flag2,flag3,然后看到fvhjjihfcv,gfuyiyhioyf,yugoiiyhi,正好三串,大概率就是传三个进去。
然后得到1chunqiu.zip。得到源码,进行代码审计。
SQL注入的点在login.php的这里:
$username = $db->safe_data($_POST['username']);
$password = $db->my_md5($_POST['password']);
$number = is_numeric($_POST['number']) ? $_POST['number'] : 1;
$username = trim(str_replace($number, '', $username));
$sql = "select * from"."`".table_name."`"."where username="."'"."$username"."'";
safe_data是转义的:
public function safe_data($value){
if( MAGIC_QUOTES_GPC ){
stripcslashes($value);
}
return addslashes($value);
}
注意trim(str_replace($number, '', $username))
发现非常多余。。。大概率就是故意给的入口点。这题也就是利用这个来进行SQL注入。
首先我们要知道,addslashes除了转义单引号双引号和反斜杠,还会转义NULL。
转义结果如下:
<?php
$a=$_GET['a'];
$a=addslashes($a);
var_dump($a);
因此这题可以这样构造来闭合sql语句,实现报错注入:
number=0
username=%00' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-- -
首先username会被addslashes转义成\0’,然后只能执行str_replace,username中0被替换为空,变成了\’,这样变成了反斜杠被转义,单引号成功逃脱。后面就可以进行报错注入了。
需要注意的是,后面的注入语句仍然不能有单双引号和0,尤其是0,因为0会被替换为空。
一般注入是这样的updatexml(1,concat(0x7e,database(),0x7e),1),因为0变成了空,所以十六进制就不能用了。
注意这些再进行报错注入就OK了。
反思
这题自己卡在了SQL注入那里,虽然注意到了那个str_replace,但是当时没想到这个可以闭合单引号,因此去思考其他的地方了。还是自己太菜了,还要努力学习!