buuctf BuyFlag Easy MD5

发布于 2020-07-15  154 次阅读


1.[极客大挑战 2019]BuyFlag

本题考察点在于cookie与php的绕过

cookie较为简单,user=0 => user=1

php 涉及 is_numeric

is_numeric()  判断变量是否为数字或数字字符串,不仅检查10进制,16进制是可以。

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!

该函数还可能造成sql注入,例如将‘1 or 1'转换为16进制形式,再传参,就可以造成sql注入

摘自https://www.cnblogs.com/GH-D/p/8085676.html

还有一个常见绕过

===: 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
==: 在进行比较的时候,会先将字符串类型转化成相同,再比较,如果比较的是一个字符串和一个数字,则字符串会被转化为数值。

strcmp()函数用来判断两个字符串是否相等,若相等,返回0。php在5.3版本之前若传入的是一个非字符串类型数据,比如数组和对象,则会报错,但在报错的同时会返回0。

该环境为php5.3.3

摘自https://www.cnblogs.com/GH-D/p/8085676.html

2.BJDCTF2020]Easy MD5

本来以为这个比较简单,谁知道是md5后的sql啊

首先要观察响应头里面的hint,这个很重要

select * from 'admin' where password=md5($pass,true)

这样的话首先是一个md5的注入,直接输入ffifdyop

原理请看这篇文章https://blog.csdn.net/March97/article/details/81222922

接下来是一个绕过

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->

典型的md5 bypass,因为md5()或者sha1()之类的函数计算的是一个字符串的哈希值,对于数组则返回false,如果$a和$b都是数组则双双返回FALSE, 两个FALSE相等得以绕过。payload:

?a[]=1&b[]=2
最后几乎就是一样的思路,虽然是强类型比较但是本质是不变的

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

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

就是把get转化成了post

参考 https://www.gem-love.com/ctf/824.html#easymd5


我是谁?我在哪?我正在做什么?