0%

sqlilabs 通关

  • 前面简单的略,记点备注,不能局限于 DVWA ,补一下基础

    一般来说提交 id=-1 防止请求的输出占据注入输出的位置

    不能用 # 注释了,换用 --+ ,其中 +url 编码中的空格

    对库名查询的时候要 group_concat(table_name) ,否则只会输出第一个表名

    下面很多题都有关键词替换,双写绕过或者大小写

    对于过滤了空格,可以用空格的 url 编码 %0a 绕过

  • $less6$ 报错注入

    先试出是双引号闭合,id=1" 发现不能判断回显位

    报错注入:通过特殊函数错误的使用,使其输出错误结果

    • BigInt (虽然这个不能用)

      exp(int) 计算 e 的次方,足够大的 x 会使函数的结果数据类型溢出导致报错,例:

      1
      ?id=1 and exp(~(SELECT * FROM (SELECT user()) a)) --+

      a 作为 SELECT user() 语句的结果,并用 SELECT * FROM 查询

      查询语句成功执行返回 $0$ ,所以取反作为 x ,使数据溢出

      同理 pow() 也可以

      仅当 MySql 版本在 5.5.5~5.5.49

    • 函数参数格式错误

      用到了 updatexml()extractvalue()

      updatexml(XML_document,Xpath_string,new_value) :分别是文档对象名称,字符串,格式,例如下:

      1
      /?id=1 and updatexml(1,concat(0x7e,user(),0x7e,version(),0x7e),3) --+

      虽然这题是双引号闭合,但加上以后代码块不能高亮了

      0x7eASCII 下的 ~ ,习惯把它放在注入函数的两端用以区分系统报错和所需信息

    • 主键重复(冲突)

      鸽,等我遇到题再说

  • $less29/30/31$ http 参数污染

    参数污染:HTTP 允许提交同名参数,而服务器及安全狗 WAF 的选取参数不一致,导致可以绕过 WAF 而提交渗透指令

    例:提交 /?id=111&id=222

    不同类型服务器会选取 111 或者 222 或者两者都有作为 id 值,具体如下表

    WAF 被架设在 Tomcat 上,而服务器在 Apache 上时,可以在前一个提交合法参数,后一个提交渗透指令来绕过 WAF

    但令人感慨的是 less29/30/31 并不需要绕过(大嘘

  • $less32/33/34/35/36/37$ 宽字节注入

    原理:PHP 自带了如 addslashes() 等转义函数,通过在 ' 前面加上反斜杠变为 \' 将其转化为字符串,防止闭合。而当服务器端编码方式为 gbk 时,可以通过加上特殊字符与反斜杠构成中文来绕过转义

    若服务器存在指令

    1
    2
    3
    SET NAMES 'gbk'
    或者
    SET character_set_client =gbk

    则存在该漏洞

    比如被转义成的 \'gbk 下编码为 %5c%27

    如果我们提交 %bb' 转义编码后为 %bb%5c%27 ,当 ASCII>128 时,sql 会认为前后两个共同组成一个汉字,即 %bb%5c 是一个宽字符,以此绕过对 ' 的转义

    值得注意的是并不一定使用 %bb ,只需要满足存在后一个编码为 %5c 的宽字符即可,理论上 %81-%FE 均可

    • 注意第 $34$

      输入被当作了字符串而非在 url 栏中输入时转为 $16$ 进制

      burp 抓包提交就神奇的可以了,其他绕过包括改 burp 中的 HEX 直接改十六进制,以及提交 ,原因是存在需要三个编码的汉字, 恰好是前两位,加上 %5c 后能构成新的汉字

      神奇的burp

    • 注意第 $35$

      逆天惯性思维,注意标题 who care for addslash()

      数字型,直接注入

  • $less38/39/40/41/42/43/44/45$ 堆叠注入 stacked injection

    通过在 sql 语句后面加上 ; 可以同时执行多条语句,这与 union select 的区别是 union select 只能执行查询语句,而堆叠注入可以执行任何操作

    但需要注意的是,第二条语句以后常常没有回显,而由于权限不足,可能执行的操作没有成功而无法得知

    其局限性还在于数据库引擎或者 API 可能不支持,如 Oracle

    注意 $less43$ 在 username 处进行了过滤,那么通过 passwd 处注入即可