1、前言
这篇文章主要介绍sql注入中常用的函数,以及函数之间配合使用及解析。
插入一段免责声明:以下语句仅用于实验,利用以下函数或语句对某用户、企业、业务造成影响的,一切与作者无关。
2、函数
2.1 substr()函数
substr()函数呢,意为substr(string,start,length) 对于给定的字符串string,从start位开始截取,截取length的长度。
length:待提取的字符串长度,若length为下面情况,返回整个字符串的所有字符。
1 length不指定。
2 length为空。
3 length为负值。
4 length大于字符串的长度。
举个例子:
substr(user,1,2)
取数据库长的第1位开始截取,取2的长度,假如说库名为admin,那就是截取ad。
这样注入的话靠盲注效率会不会有点低?好的,我们可以配合其它函数。
2.2 ascii()函数
ascii()呢准确的说不算是函数,其实ascii()就是返回字符的ascii码。
下面我们把ascii()和substr() 配合使用,举个例子:
ascii(substc(database(),1,1))
这个语句意思就很明显了吧,意为substr()函数从database()库名的第一位开始截取,截取长度为1.
ascii(substr(database(),1,1))=xxx
然后呢把截取的库名进行ascii()编码,假如说ascii(substr(database(),1,1))=102,通过ascii对照表,那么database()第一位就是102.
那么数据库第二位呢?
原理一样哈:
ascii(substr(database(),2,1))=xxx
2.3 exp()数字函数
先解释一下这个函数什么意思,用于计算e的x次方的函数。e为底数,x为指数。
e=2.718281828459045
举个例子:
exp(1)=2.718281828459045 这下明白了吧。
那么好,exp()函数有一个上限值,为exp(710)
exp(710)时会溢出,x大于709时会报错溢出。
那么说我们把以上函数结合使用呢?
举个例子,字符型注入,构造个poc如下:
id=1'and exp(if((ascii(substr(database(),1,1))=xxx)1,11111)) or'1'='1
这个poc什么意思呢?这里我简单解释下:
首先id=1' or '1'='1
其实这个语句传输到数据库中呢应该是 where xxx from xxx id='1' or '1'='1'
那么exp(if((ascii(substr(database(),1,1))=xxx)1,11111))呢?
结合我们上面的内容其实就很明显了哈:
意思就是说通过substr()函数从数据库database()第一位开始截取,截取长度为1,然后把截取的结果通过ascii()编码转换,最后转换为ascii()10进制的值,然后由exp函数带出。
这里可能有点模糊?我举个简单的例子:
加入database()库名第一位是a,那么当xxx值为97的时候,语句就为exp(if((ascii(substr(database(),1,1))=97)1,11111))
这个时候其实页面就会正常返回,因为if()条件是成立的,就会返回1,最终的结果为exp(1).这样是不是就明白了呢?
2.4 extractvalue()函数
extractvalue()函数,extractvalue(XML_document, XPath_string),XML_document是String格式,为XML文档对象的名称;
XPath_string(Xpath格式的字符串),注入时可操作的地方。
以字符型注入举个例子:
id=1' and extractvalue(1,concat(0x7e,database(),0x7e))--
其实可操作的地方为concat(0x7e,database(),0xte),当然concat()内容可灵活替换。
2.5 updatexml 函数
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串).
第三个参数:new_value,String格式,替换查找到的符合条件的数据
以数字型注入举个例子:
id=1 updatexml(1,concat(0x7e,version(),0x7e)
3 总结
这次分享就简单到这里,具体呢还有很多方便要判断,比如说数据库的类型,以及是否屏蔽哪些参数函数?这个都需要绕过判断。