GoSQL

​ 最近摸了太久的鱼,决定还是继续向大佬们学习。

​ 首先“护网杯”打到我自闭了,发现注入还是比较重要的,所以我重新写一下SQL简单注入的一些东西,为了方便理解,我就采用一些CTF的题目来演示。

​ 0X01 最基础的SQL注入

​ URL:http://password.game.sycsec.com/

​ 这道题目就是一个登陆框,按照CTF的基本思路。首先就是看源码,看请求头,扫目录(robots.txt / .git / .svn),结果并没有发现有用的东西,所以基本上断定就是在登陆框上面做文章,登陆框的思路,无非就是第一步尝试弱口令,第二步就是SQL注入。我们尝试一下admin/admin弱口令登陆,下面居然提示sql错误,那就确认是SQL注入无疑了。

The sql you execute in final :select * from users where username='admin' 
and password='admin';

弱口令尝试

​ 所以我们构造一下SQL注入语句。

Username:admin
Password:'or'1

注入成功

​ 注入成功,成功获得Flag!

​ 0X02 注入升级,字符注入

​ URL:http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php

​ 然后在实验吧的CTF的训练营中还有很多有趣的题目,我就随便拿一题来说一下。这题也是一样首先就是看源码,看请求头,扫目录(robots.txt / .git / .svn),结果在源码的注释忠发现了有意思的东西。

    $password=$_POST['password'];
    $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
    $result=mysqli_query($link,$sql);
        if(mysqli_num_rows($result)>0){
            echo 'flag is :'.$flag;
        }
        else{
            echo '密码错误!';
        } 

​ 所以基本断定就是注入,但是要注意的是,他这里把传入的password做了处理,对用户输入的密码首先进行md5($password,true)函数处理,再进行拼接SQL语句查询。所以这里的注入问题就是,什么字符在进行md5($password,true)的处理后能变成注入语句。

​ 如果对md5函数不清楚的小伙伴可以看一下:

MD5函数

​ 我在做的时候就没注意md5的参数,在TRUE的情况下,md5返回的字符正是我们需要的注入字符(比如常见的万能密码 ' or '1' =1')
​ 什么样的字符能够满足要求呢,这里有个坑,其实实验吧已经准备好啦,文件名就可以,下面是我在本地对ffifdyop在md5加密16位和32位输出的区别:

<!DOCTYPE html>
<html>
<body>

<?php 
$str = "ffifdyop"; 
echo "The string: ".$str."<br>"; 
echo "TRUE - Raw 16 character binary format: ".md5($str, TRUE)."<br>"; 
echo "FALSE - 32 character hex number: ".md5($str)."<br>"; 
?>  
  
</body>
</html>

执行结果

​ 我们要输入的密码就是ffifdyop。

GetFlag