postgre的like有个特性,不好解释直接上例子
1 | SELECT * FROM "public"."testtable" WHERE name like 'fl%\' |
当like字符串结尾有\的时候,如果前面的字符串能在数据库里匹配到内容(且被匹配的字符串还有剩余)就会报错ERROR: LIKE pattern must not end with escape character,如果没匹配到就不报错(猜测是因为匹配没执行到\,所以不报错)
例如这么一个数据库
| id | name | code | pass |
|---|---|---|---|
| 1 | flag{123qwwe} | qwe | asd |
| 2 | adssac | zxc | bdvds |
执行SELECT * FROM "public"."testtable" WHERE name like 'fl%\',数据库里匹配到了fl%,此时就会报错

执行SELECT * FROM "public"."testtable" WHERE name like 'fls%\',数据库里匹配不到fls%,就不报错,返回空结果

如果匹配到结尾SELECT * FROM "public"."testtable" WHERE name like 'fl%}\',被匹配的字符串已经结束了,也不报错

利用这个特性就可以整个盲注,只返回查询成功不成功,一位一位的爆flag,还是用上面的数据库
1 |
|
构造盲注脚本
1 | import requests |
运行只能注到flag{123qwwe,因为最后一步执行的是SELECT * FROM public.testtable WHERE name LIKE 'flag{123qwwe}%\',被匹配的字符串已经结束了,所以也不会报错,判断不出来最后一位字符。但是flag的最后一位一般都是},自己补上就完了
上面那个脚本只能注一个,如果数据库里有多行数据就不行了,下面这个可以把数据库里所有行都注出来:
1 | import requests |
1 | a |
当然有些情况比如数据库里一条是adssac另一条是adssacs这种情况由于前缀一样,短的注一半停了会漏掉长的,但是出题数据库里flag一般是唯一的,不会有相同的前缀。能判断出来flag是哪个就行。